把我以前学习过的一个东西拿出来分享下~

3D服务器端玩家行走处理是服务器端根据客户端行走路径、玩家行走时间以及速度(包括变化速度)计算得出玩家的当前位置。

由于客户端行走是一条路径,不使用2D中的格子计算算法,未能高效的获取角色的当前位置,运用玩家行走路径,行走速度,行走时间这些已量,进行计算玩家的当前精确位置。由于3D游戏中的点为xyz的空间点,所以牵连的计算为3维向量计算。

空间两点距离计算公式为:

玩家在某条线段上的坐标x:

玩家在某条线段上的坐标y:

玩家在某条线段上的坐标z:

角色当前位置计算原理分析:

角色行走是一条路径,这条路径使用点序列表示,角色开始行走记录当前时间TimeStart,获取觉得当前位置的计算,首先获取当前时间TimeNow,根据TimeNow-TimeStart的时间差与角色的行走速度,获取角色已经行走过的距离distance,计算每两点的距离,判定角色当前时间所处在哪一条路径上,及角色在哪两点之间。然后使用向量计算公式计算当前角色处于的坐标点位置。

角色位置位置计算的类封装实现代码:

  1 #pragma once
  2
  3 class CCoordinatePath
  4 {
  5 public:
  6     CCoordinatePath(void);
  7     ~CCoordinatePath(void);
  8
  9 public:
 10     // 更新行走路径
 11     void UpdatePath(COORDINATE_3D stopCoordinate3D);
 12     void UpdatePath(vector<COORDINATE_3DPATH> vtPath, COORDINATE_3D stopCoordinate3D, float nCompletePath = 0);
 13     // 开始行走(移动计算)
 14     void StartMove(DWORD dwStartTime);
 15     // 获取当前空间位置
 16     COORDINATE_3D GetCoordinate(DWORD dwNowTime);
 17     // 获取行走路径
 18     const vector<COORDINATE_3DPATH>* GetPath();
 19     // 获取停止位置
 20     COORDINATE_3D GetStopCoordinate();
 21     // 获取移动总距离(从开始行走到现在的行走总距离)
 22     float GetCompletePath(DWORD dwNowTime);
 23     // 更新玩家速度
 24     void UpdateSpeed(unsigned short wSpeed, DWORD dwNowTime);
 25     // 获取当前速度
 26     unsigned short GetSpeed();
 27     // 玩家是否正在移动
 28     bool IsMoving(DWORD dwNowTime);
 29
 30 private:
 31     // 行走路径
 32     vector<COORDINATE_3DPATH> m_vtPath;
 33     // 停止点
 34     COORDINATE_3D m_stopCoordinate3D;
 35
 36     // 已完成路径
 37     float m_nCompletePath;
 38     // 玩家当前速度
 39     unsigned short m_wCurSpeed;
 40     // 行走路径开始时间
 41     DWORD m_dwStartMoveTime;
 42
 43 };
 44
 45 #include "StdAfx.h"
 46 #include "CoordinatePath.h"
 47
 48 CCoordinatePath::CCoordinatePath(void)
 49 {
 50     m_wCurSpeed = 4;
 51 }
 52
 53 CCoordinatePath::~CCoordinatePath(void)
 54 {
 55 }
 56
 57 void CCoordinatePath::UpdatePath( COORDINATE_3D stopCoordinate3D )
 58 {
 59     m_vtPath.clear();
 60     m_stopCoordinate3D = stopCoordinate3D;
 61     m_nCompletePath = 0;
 62 }
 63
 64 void CCoordinatePath::UpdatePath( vector<COORDINATE_3DPATH> vtPath, COORDINATE_3D stopCoordinate3D, float nCompletePath /*= 0*/ )
 65 {
 66     m_vtPath = vtPath;
 67     m_stopCoordinate3D = stopCoordinate3D;
 68     m_nCompletePath = nCompletePath;
 69 }
 70
 71 void CCoordinatePath::StartMove( DWORD dwStartTime )
 72 {
 73     m_dwStartMoveTime = dwStartTime;
 74 }
 75
 76 COORDINATE_3D CCoordinatePath::GetCoordinate(DWORD dwNowTime)
 77 {
 78     if (m_vtPath.size() == 0)
 79     {
 80         return m_stopCoordinate3D;
 81     }
 82
 83     float nTotalDistance = GetCompletePath(dwNowTime);
 84
 85     if (nTotalDistance < 0)
 86     {
 87         cout << "计算玩家移动距离错误" << endl;
 88         return m_stopCoordinate3D;
 89     }
 90
 91     // ceshi
 92     //cout << "距离:" << nTotalDistance << "时间" << (dwNowTime-m_dwStartMoveTime) << endl;
 93
 94     COORDINATE_3D coordinate3D;
 95
 96     // 上面已经计算出玩家行走总距离,计算玩家位置
 97     vector<COORDINATE_3DPATH>::iterator itPath = m_vtPath.begin();
 98     for (; itPath!=m_vtPath.end(); ++itPath)
 99     {
100         if (itPath->allDistance > nTotalDistance)
101         {
102             // 角色当前位置在当前path中,计算当前位置
103             float nCurDistance = nTotalDistance - (itPath->allDistance - itPath->curDistance);
104
105             if (nCurDistance < 0)
106             {
107                 cout << "[严重错误]获取坐标" << endl;
108                 return m_stopCoordinate3D;
109             }
110
111             coordinate3D.x = itPath->x + itPath->dFormula*itPath->xDistance*nCurDistance;
112             coordinate3D.y = itPath->y + itPath->dFormula*itPath->yDistance*nCurDistance;
113             coordinate3D.z = itPath->z + itPath->dFormula*itPath->zDistance*nCurDistance;
114             coordinate3D.dir = itPath->dir;
115
116             if (coordinate3D.x ==1 && coordinate3D.y==1 && coordinate3D.z == 1)
117             {
118                 int i = 0;
119             }
120             ///yang
121             //cout << "当前移动坐标:x:" << coordinate3D.x << ",y:" << coordinate3D.y << ",z:" << coordinate3D.z << endl;
122             ///yang
123             return coordinate3D;
124         }
125     }
126
127     // 到达目标点做先前点路径的清理工作
128     m_vtPath.clear();
129
130     return m_stopCoordinate3D;
131 }
132
133 const vector<COORDINATE_3DPATH>* CCoordinatePath::GetPath()
134 {
135     return &m_vtPath;
136 }
137
138 COORDINATE_3D CCoordinatePath::GetStopCoordinate()
139 {
140     return m_stopCoordinate3D;
141 }
142
143 float CCoordinatePath::GetCompletePath( DWORD dwNowTime )
144 {
145     // 无变速的移动距离计算
146     DWORD dwMoveTime = dwNowTime-m_dwStartMoveTime;
147
148     return (m_nCompletePath + m_wCurSpeed*dwMoveTime/1000.0f);
149 }
150
151 void CCoordinatePath::UpdateSpeed( unsigned short wSpeed, DWORD dwNowTime )
152 {
153     // 计算已经完成路径
154     m_nCompletePath += GetCompletePath(dwNowTime);
155     m_dwStartMoveTime = dwNowTime;
156
157     m_wCurSpeed = wSpeed;    //当前速度
158 }
159
160 unsigned short CCoordinatePath::GetSpeed()
161 {
162     return m_wCurSpeed;
163 }
164
165 bool CCoordinatePath::IsMoving( DWORD dwNowTime )
166 {
167     GetCoordinate(dwNowTime);
168
169     if (m_vtPath.size() > 0)
170     {
171         return true;
172     }
173     else
174     {
175         return false;
176     }
177 }

转载于:https://www.cnblogs.com/Mushrooms/p/3141819.html

3D 服务器端以向量计算为主的角色位置的算法相关推荐

  1. 3D游戏角色模型布线参考素材 角色设定资料

    3D游戏角色模型布线参考素材 角色设定资料 高清大图

  2. 易语言大漠游戏一键登录自动判断判断角色位置

    当输入账号秘密成功后 很多游戏到了角色选择的界面,有的游戏一个账号下允许建立三个角色,那么在这一环节,就必须根据账号来点选角色的位置是左.中.右还是这个账号下只有一个角色,所以我们建立一个子程序要传递 ...

  3. 短发美女3D建模,高质量女性角色雕刻,老司机带你涨见识~

    短发美女3D建模,高质量女性角色雕刻,老司机带你涨见识~

  4. 【翻译】利用加速度求解位置的算法——三轴传感器

    cposture 一个小白的技术成长之路 [翻译]利用加速度求解位置的算法--三轴传感器 http://www.cnblogs.com/cposture/p/4378922.html 摘要      ...

  5. 利用加速度求解位置的算法——三轴传感器

    转载的一篇文章,跟自己做过的一个车载项目类似,也算是标记一下吧. ---------------------------------------分割线------------------------- ...

  6. android 网络wifi定位服务器,基于位置指纹算法的Android平台WiFi定位系统

    近年来,随着城域无线基础网络的发展,热点(AP)的覆盖范围已大大增加. 由于对定位服务的需求增加以及WiFi应用的扩展,WiFi定位已成为一种有效的定位方法. GPS卫星定位是最重要的定位方法. 它需 ...

  7. 捷联惯导算法(二)位置更新算法的理解

    前言 文中算法公式摘自<捷联惯导算法与组合导航原理>(严恭敏.翁浚 编著).<惯性导航>(秦永元 编著),其他理解仅代表个人观点.本文是对位置更新算法,按照自己学习的思路整理得 ...

  8. 涨姿势!3D游戏里的男女性角色是这样建模出来的

    对于刚刚学3D建模的来说,学习做一个人物角色是最困难的事情,特别是在面部造型,所以今天小编就去收集了一下干货技巧,希望能帮助到大家. 一:形式--基础形式是最重要,它是平衡的基础 即使眼睛和嘴巴部分完 ...

  9. 入门3D游戏建模,是选择角色建模还是场景建模,看完你来选

    3D场景建模师 场景则是游戏中的环境.机械.道具等死物.场景开始对美术的要求没有那么高,只要熟练运用3D软件就行了. 逐步掌握游戏场景元素设计理念,不同风格游戏的制作方法.着重学习材质处理技法,能够根 ...

最新文章

  1. oracle数据库如何写翻页_ORACLE数据库分页查询/翻页 最佳实践
  2. BS开发中常用的Javascript技术
  3. 推荐些在线小制作小工具
  4. 如何合理使用java异常_如何更合理的利用Java中的异常抛出?
  5. c语言程序设计橙皮,橙皮_中药词典C_中医中药网
  6. Party at Hali-Bula UVA - 1220(树形dp)
  7. 分布式锁的多种实现方式
  8. C#中的CultureInfo类
  9. leetcode刷题:删除链表中的节点
  10. Python零基础入门(三)——函数[学习笔记]
  11. Spark之functions
  12. 凯利公式计算器安卓_手机计算器别只用来算数!1秒开启隐藏功能,你不会还没发现吧...
  13. 中国AI公司会议室取名简史
  14. 入门物联网还得靠嵌入式
  15. python 做深度学习时偶遇的 (0xC0000409)错误
  16. 解决WPS高分辨率下因字体缩放导致字体发虚的问题
  17. 2022年终结——人生中最美好的一站
  18. vue 移动端头像裁剪_移动端 上传头像 并裁剪功能(h5)
  19. 单片机实验(十三)串口自发自收实现
  20. 千锋内部邮件曝光:学员高就业率的背后…

热门文章

  1. 深入浅出Netty之四 Client请求处理
  2. career opportuties
  3. teach and learn
  4. !和?在formal method里面的意思
  5. 磁盘上重复的贴图在内存中也会重复存在
  6. UNITY polygon collider不随物体旋转
  7. Linux驱动之混杂设备(misc)
  8. Oracle不使用索引的几种情况列举
  9. Windows环境下maven 安装与环境变量配置
  10. 关于Operation 的那些事