Articles of 定位

二维空间战斗 – 回合制,方向/面向

另一个重写 – 他们的方式感谢,因为你的前批评让我想到这一点: 我目前正在构建一个太空战术回合制战斗游戏。 运动(现在)在网格上。 玩家select一个单位并命令它移动。 当敌方单位在舰艇武器的射程和弧度范围内时,攻击自动发生。 在这种情况下,面向/面向是非常重要的。 订单被给予,并在“行动阶段”执行(一次) 玩家如何控制船舶在电网内旋转? 为每一艘船调整它似乎乏味。 但是因为它的射击弧线非常重要,所以我想find一个方法: 快速简便的方式让玩家在网格中移动一个单位(获得移动) 在订单阶段可以看到并控制船舶正面。 在实战中没有更多的干预。 我对自己对这个问题的解释并不满意,但是现在找不到更好的方式来描述它。 如果您有任何疑问,请询问。

转换到本地和世界三维坐标空间?

我一直在关注我在这里find的指南( http://knol.google.com/k/matrices-for-3d-applications-view-transformation )关于构建一个matrix,这将允许我的3D坐标到一个对象的本地坐标空间,然后再回来。 我试图用我的对象的外观,侧面,向上和位置vector来实现这两个matrix,它似乎是前三个坐标的工作。 对于我所期待的w坐标,我有点困惑。 以下是我构建的基础知识打印输出的几个示例。 我每次都传递一个[9,8,14,1]的testing向量,看看我是否可以转换两种方式: 基本示例: localize matrix: Matrix: 0.000000 -0.000000 1.000000 0.000000 0.000000 1.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 5.237297 -45.530716 11.021271 1.000000 globalize matrix: Matrix: 0.000000 0.000000 1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 -11.021271 -45.530716 -5.237297 1.000000 test: Vector4f(9.000000, 8.000000, 14.000000, 1.000000) localTest: Vector4f(14.000000, 8.000000, 9.000000, […]

vector幅度的方向

首先,快速浏览我的问题:我有一个游戏实体,它有一个四元数来表示它的旋转/方向。 它的线速度在世界空间也有一个3Dvector。 从实体的角度来看,还有3个虚拟轴(标准的z =前进/后退,y =上/下,x =左/右)。 通过这些相关的部分,我想find相对于一个实体的虚拟轴的速度(即它向右移动的速度),以便我可以向玩家展示这个速度和/或应用一个反作用力方向。 我有一个模糊的想法,我需要通过方向四元数来转换我正在查询的方向对应的单位vector,然后计算结果和速度vector之间的角度。 然后用这个角度计算出目标方向的速度幅度有多大(也许使用余弦?)。

我如何修理我的行星相机?

概要 我在实施适合第一人称使用的相机控制器时遇到了麻烦。 相机需要根据重力(从相机位置向行星中心的vector)正确定位。 我希望观察方向相对于地球表面保持不变。 这意味着即使鼠标未被触摸,观看方向也应该随着方向改变而移动。 不这样做会让玩家感到困惑。 尝试 我尝试了许多不同的解决scheme。 最大的问题是,我使用的世界向上(0,1,0)和相机的方向之间的转换导致在南极旋转 。 当南极附近的方向发生变化时,相机会自行调谐。 如果你保持静止并环顾四周,那很好,但是对于每一帧的方向改变,相机都会自动旋转。 我已经将它隔离到摄像机方向的俯仰部分(如果完全移除俯仰,摄像机偏航performance良好)。 就目前为止我所能理解的情况来看,这与此有关:假设你在赤道上,面对北极。 你没有改变方向走到北极。 你如何向右移动,直到赤道。 此时,你正面临着赤道 ,尽管从来没有有意改变方向。 我不需要关于相机如何工作,或matrix或四元数如何工作的理论帮助。 我需要math奇才或有经验的人的帮助。 码 每个部分代表了解决scheme的不同尝试。 上面有每个描述问题的评论。 (我很高兴废除所有这些代码;我只是想要一些可行的。) void Camera::set_angles_advanced(float horizontal, float vertical) { glm::mat4 trans; float factor = 1.0f; float real_vertical = vertical; m_horizontal += horizontal; m_vertical += vertical; while (m_horizontal > TWO_PI) { m_horizontal -= TWO_PI; } […]

如何计算具有特定最终向上vector的2个向量之间的四元数旋转?

我知道你可以在所有的优化之后用这样的东西计算两个向量之间的四元数旋转: quat quat::fromtwovectors(vec3 u, vec3 v) { vec3 w = cross(u, v); quat q = quat(dot(u, v), wx, wy, wz); qw += q.magnitude(); return normalize(q); } 但是,这将返回vec u和vec v之间的最短四元数旋转。有没有办法计算方向A(具有dir向量和向上向量)和方向B之间的四元数旋转? 就像是 quat quat::from_two_orientations(vec3 u_dir, vec3 u_up, vec3 v_dir, vec3 v_up)

将方向vec3转换为旋转matrix

我有一个标准化的vec3代表一个方向。 每一帧animation,一个对象的方向都会稍微改变,所以我给方向vector添加一个deltavector,然后进行归一化以find新的方向。 我想将代表一个方向的vec3转换成一个旋转matrix,我可以用它来定向我的对象。 如果有帮助,我的对象是一个锥体,我想旋转它的尖端,而不是从它的中心:) PS我知道我应该使用四元数,因为万向节locking问题。 如果有人可以解释quats,那就太棒了:)

设置Bullet / Ogre中字符的方向

我一直在忍受一个关于在我使用Ogre3D和Bullet物理实现的游戏中定位角色的问题。 我拥有的:角色正在移动的方向vector,以及它当前的方向。 我需要的是:设置角色的方向来面对它正在移动的方向。 我有这样的代码片段做我想要的: btTransform src = body->getCenterOfMassTransform(); btVector3 up = BtOgre::Convert::toBullet(Ogre::Vector3::UNIT_X); btVector3 normDirection = mDirection.normalized(); btScalar angle = acos(up.dot(normDirection)); btVector3 axis = up.cross(normDirection); src.setRotation(btQuaternion(axis, angle)); body->setCenterOfMassTransform(src); 哪里“身体”是我试图定位的刚体。 这段代码有几个问题: 1)改变方向时,往往会“抖动”,即快速朝向一个方向,然后相反的一秒钟左右,然后自行改正方向。 2)代码运行的大部分时间,我从Bullet的btQuaternion上得到一个断言错误 assert(d != btScalar(0.0)); 谁能帮忙? 谢谢!

我如何重新调整对象的坐标轴?

我昨天在Unity中度过了一段时间,试图从一个水平圆柱体上发射一个球体(就像一个大炮的球)。 我正在使用Vector3.forward,但球体不断从缸的顶部,而不是前面出来。 有人建议,而不是使用Vector3.up,果然,它的工作! 气缸默认是垂直的。 所以,当我旋转圆柱90度使其平坦时,局部轴保持不变。 圆柱体的相对前端保持在同一点,所以当我开启球体时,它会popup新的“顶部”,而不是像“前”那样在我看来。 如果我碰巧面对另一种方式,那么我将不得不在Vector3.down中进行reflection。 我如何重新调整/重置对象的坐标轴以符合我的期望? (如果我不能,我怎么能通过查找一个对象的方向来判断?)

由专利保护的外部文件的游戏本地化?

http://www.google.ch/patents/US7930167 这个专利解释了从外部文件加载游戏语言。 我很确定这已经在很多游戏中实现了。 我不确定他们是否违反了专利。 那么将允许什么样的本地化?

四元数看起来与vector

我已经为我的屏幕元素实现了“查看”方法,并且几乎可以工作。 ScreenElement类使用R3vector和四元数来确定位置和方向。 作为一个便利的function,我实现了一个“看”的方法。 我不是线性代数最大的专家,所以我的解决scheme是我在论坛上find的东西的适应。 但这是我理解的唯一解决scheme。 目前的做法如下: void SceneElement::look_at(const mx::Vector3f& target, const mx::Vector3f& up) { mx::Vector3f forward_l = mx::normalize(target – position); mx::Vector3f forward_w(1, 0, 0); mx::Vector3f axis = forward_l % forward_w; float angle = mx::rad_to_deg(acos(forward_l * forward_w)); mx::Vector3f third = axis % forward_w; if (third * forward_l < 0) { angle = – angle; } orientation […]