Questions tagged «mathematics»

数学问题涉及游戏开发中使用的算术,几何,微积分,公式和其他计算。

3
为什么在Lerping函数中使用Time.deltaTime?
据我了解,两个值(之间的线性插值内插功能a和b使用第三值()t之间)0和1。在t = 0处返回值a,在处返回t = 1值b。值为0.5时,返回a与之间的中间值b。 (下图是一个平滑的步骤,通常是三次插值) 我一直在浏览论坛,在这个答案上,我找到了以下代码行:transform.rotation = Quaternion.Slerp(transform.rotation, _lookRotation, Time.deltaTime); 我对自己说:“真是个傻瓜,他不知道”,但是因为它有40多个投票,所以我尝试了一下,果然成功了! float t = Time.deltaTime; transform.rotation = Quaternion.Slerp(transform.rotation, toRotation, t); Debug.Log(t); 我之间的随机值0.01,并0.02为t。函数不应该相应地插值吗?为什么这些值会堆叠?我不明白勒普是什么意思?

3
进攻VS防守,谁是赢家?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我正在用手机创建一个新的简单游戏,并且在以下部分上花了几天的时间。 为了简单起见,假设我有两个战士。他们的唯一属性是攻击和防御。第一次进攻时,唯一重要的是他的进攻和对手的防守。反之亦然。 他们没有设备,物品,耐力或健康。只是进攻还是防守。 例: 战斗机1: 进攻:50,防守:35 战斗机2: 进攻20,防守:80 战斗过程将只取决于一次攻击即可确定获胜者。因此,没有多重攻击或回合。我不想使其具有确定性,而是添加一个意想不到的简单版本。具有较低攻击力的战斗机将能够赢得具有较高防御力的另一架战斗机(但并非每次都可以) 我的第一个想法是使其线性化,并调用统一的随机数生成器。 If Random() < att1 / (att1 + def2) { winner = fighter1 } else { winner = fighter2 } 以进攻50和防御80为例,进攻战斗机将有大约38%的胜率。但是,在我看来,意料之外的事情太遥不可及,最差的战斗机将赢得很多。 我想知道您如何处理类似情况。 PS:我在此QnA和其他资源中进行了大量搜索,发现相似的问题对于SE来说范围太广。但是它们具有许多属性,武器,物品,类等,可能会使它变得过于复杂。我认为我的版本要比SE的QnA风格简单得多。

2
如何从变换矩阵中提取欧拉角?
我有一个实体/组件游戏引擎的简单实现。 变换组件具有设置局部位置,局部旋转,全局位置和全局旋转的方法。 如果将变换设置为新的全局位置,则局部位置也会更改,以在这种情况下更新局部位置,我只是将当前的变换局部矩阵应用于父级的变换世界矩阵。 在那之前,我没有任何问题,我可以获得更新的局部变换矩阵。 但是我正在努力如何在变换中更新局部位置和旋转值。我想到的唯一解决方案是从变换的localMatrix提取平移和旋转值。 对于翻译来说,这很容易-我只取第4列的值。但是轮换呢? 如何从变换矩阵中提取欧拉角? 是这样的解决方案右?: 要查找围绕Z轴的旋转,我们可以发现localTransform和X的X轴矢量之间的差值轴线parent.localTransform的矢量,结果存储在德尔塔,则:localRotation.z = ATAN2(Delta.y,德尔塔。X); 围绕X和Y旋转相同,只需要交换轴即可。

4
等距交错地图:计算屏幕上点的地图坐标
我知道已经有很多相关资源,但是我还没有找到与我的坐标系相匹配的资源,因此在调整这些解决方案以满足我的需求时遇到了很大的麻烦。我了解到,做到这一点的最佳方法是使用转换矩阵。实现这没问题,但是我不知道我必须以哪种方式变换坐标空间。 这是显示我的坐标系的图像: 如何将屏幕上的点转换为此坐标系?


1
为什么Unity的OnCollisionEnter不能给我表面法线,最可靠的方法是什么?
Unity的on碰撞事件为您提供了Collision对象,该对象为您提供了有关发生的碰撞的一些信息(包括具有击中法线的ContactPoints列表)。 但是您不会得到的是所命中的对撞机的表面法线。这是说明的屏幕截图。红线来自ContactPoint.normal,蓝线来自RaycastHit.normal。 这是Unity隐藏信息以提供简化API的实例吗?还是标准的3D实时碰撞检测技术只是不收集这些信息? 对于问题的第二部分,确保碰撞产生表面法线的方法是一种肯定有效且相对有效的方法? 我知道射线投射可以为您提供表面法线,但似乎我需要针对所有场景进行多次射线投射才能做到这一点(也许接触点/法线组合在第一次投射时错过了对撞机,或者您可能需要对所有物体进行平均接触点的法线以获得最佳效果)。 我目前的方法: 备份Collision.contacts[0].point其正常命中 对播放正常的否定命中的光线float.MaxValue,Collision.collider 如果失败,请对非负法向重复步骤1和2。 如果失败,请尝试执行步骤1至3 Collision.contacts[1] 重复4,直到成功或直到所有接触点耗尽为止。 放弃,返回Vector3.zero。 这似乎可以捕获所有内容,但是所有这些射线广播都使我感到不安,并且我不确定如何在足够的情况下测试这种方法是否奏效。有没有更好的办法? 编辑 如果这确实是3D冲突的处理方式,那么在一般情况下为什么要概述为什么与Unity特有的东西一样受欢迎。

2
在3D游戏中向目标射击的算法
对于那些想起“下降自由空间”的人来说,它有一个不错的功能,可以帮助您在射击非归巢的导弹或激光时瞄准敌人:它在您追赶的船前显示了十字准线,告诉您在哪里射击才能击中移动的物体。目标。 我尝试使用来自/programming/4107403/ai-algorithm-to-shoot-at-a-target-in-a-2d-game?lq=1的答案,但它适用于2D,所以我尝试了适应它。 我首先分解计算以求解XoZ平面的交点并保存x和z坐标,然后求解XoY平面的交点,然后将y坐标添加到最终的xyz中,然后将其转换为剪贴空间并在其上放置纹理坐标。但是,它当然不能正常运行,否则我就不会提出这个问题。 根据我的发现,在XoZ平面中找到x和在XoY中找到x之后,x并不相同,因此一定有问题。 float a = ENG_Math.sqr(targetVelocity.x) + ENG_Math.sqr(targetVelocity.y) - ENG_Math.sqr(projectileSpeed); float b = 2.0f * (targetVelocity.x * targetPos.x + targetVelocity.y * targetPos.y); float c = ENG_Math.sqr(targetPos.x) + ENG_Math.sqr(targetPos.y); ENG_Math.solveQuadraticEquation(a, b, c, collisionTime); 第一次targetVelocity.y实际上是targetVelocity.z(与targetPos相同),第二次它实际上是targetVelocity.y。 XoZ之后的最终位置是 crossPosition.set(minTime * finalEntityVelocity.x + finalTargetPos4D.x, 0.0f, minTime * finalEntityVelocity.z + finalTargetPos4D.z); 在XoY之后 crossPosition.y = …
11 mathematics  ai  aiming 

3
如何沿着另一个对象的圆周移动一个对象?
我太过数学了,很难受,但对你们中的某些人来说应该是小菜一碟。我想在一个简单的圆形路径上沿对象的年龄或周长围绕另一个对象移动对象。目前,我的游戏算法知道如何移动精灵并将其放置在障碍物的边缘,现在它会根据各种条件等待下一个点的移动。 因此,这里的数学问题是如何得到(AX,AY)和(BX,BY)位置,当我知道中心(CX,CY),目标位置(OX,OY)和需要移动的距离(d)
11 java  mathematics 

5
有人可以解释乘法/级联中colum vs row major的(原因)吗?
由于我对矩阵的两个标准感到困惑,因此我试图学习如何构造视图和投影矩阵,并在实现过程中遇到困难。 我知道如何乘法矩阵,并且可以看到乘法之前的转置会完全改变结果,因此需要以不同的顺序进行乘法。 我不明白的是什么仅是“符号约定” -从这里和这里的文章看来,作者断言这对矩阵的存储或转移到GPU的方式没有影响,而在第二个方面分页该矩阵显然不等同于将其布置在行大的内存中;如果我查看程序中的填充矩阵,我会看到翻译组件占据了第4、8和12个元素。 鉴于: “与列主矩阵的后乘运算产生的结果与与行主矩阵的预乘结果相同。” 为什么在以下代码段中: Matrix4 r = t3 * t2 * t1; Matrix4 r2 = t1.Transpose() * t2.Transpose() * t3.Transpose(); r!= r2 为何,为什么pos3!= pos为什么: Vector4 pos = wvpM * new Vector4(0f, 15f, 15f, 1); Vector4 pos3 = wvpM.Transpose() * new Vector4(0f, 15f, 15f, 1); 乘法过程是否根据矩阵是行还是列主矩阵而改变,或者仅仅是顺序(对于等效效果)? 让事情变得更清晰的一件事是,当提供给DirectX时,我的列主WVP矩阵已成功通过HLSL调用成功用于转换顶点:mul(vector,matrix),应将向量视为row-major,那么我的数学库提供的列主矩阵如何工作?


4
如何使物体的速度降低而使其速度降低
我正在用Flash开发游戏,需要一些帮助。可以认为是数学问题。 我的物体飞速飞行,X我的物体可能与石头碰撞。当它与石头碰撞时,我需要我的物体打破石头并继续,但速度要慢一些。这很容易硬编码和写是这样的:myVelocity -= 10;,但我的主要问题是,我希望它输少的速度越高,初始速度。 例如:如果速度为300,我希望它损失10,如果速度为200,我希望它损失20。 可以用某种公式来完成吗?

2
如何计算拦截向量?
给定一个二维空间,一艘友好的太空飞船停滞不前,一个敌人没有以已知的实际位置,速度和方向直接移动到友好的飞船上。 友好的战舰想进入射击场与敌人作战。 实际上,我只是将矢量设置为实际位置的移动船舶,并在每一帧进行重新计算,从而产生某种“圆形”飞行路径。 我想要的是设定一条直直的路径,以达到到达发射距离时敌人(大概)将要到达的位置(假设直到那时敌人不会改变方向)。 作为第一个“简单”的实现,如果我们假设朋友可以立即从0加速到max,就足够了。 首选实现方式将考虑朋友的加速能力,并知道何时由于速度而无法进行拦截。它应该以各种启动速度工作,而不仅是静止不动。如果它甚至考虑制动,则将是一个加分(在给定的宇宙中,以光速进行战斗对能量效率极低)

1
反射角度
我有这个“突破风格”的游戏。 我在中心有一门大炮,大炮周围有方块,方块周围有护垫。游戏外观如下: 我设法获得了每个像素的碰撞,并且我的球在与块接触时通过以下数学运算“ 反映 ”: Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180; 蓝线是球的方向,黑线(基线)是块的表面。 方向是以弧度表示的角度(当然可以转换为度)。 球通过以下方式移动: // Event.ENTER_FRAME x += Math.sin(Direction) * Velocity; y -= Math.cos(Direction) * Velocity; 到目前为止,一切都很好。 我的问题现在出在垫子上(小彩色块周围的3个深色大块)。 当它们转过来时,表面角度会发生变化。 不仅如此,球也应该击打侧面,那么,如何测量击球的方向和球的新运动方向呢? ps:如果需要,我可以提供代码和可播放的swf。 编辑 好的,角度问题已通过Vectors解决,但侧面和后部碰撞仍然存在问题。 我将为此打开另一个问题,并将其链接到此处。

1
沿曲线移动对象同时旋转它
我想沿着曲线移动物体。我希望在曲线的特定点上,物体可以改变速度并沿其轴旋转。 想象一下一架飞机飞往目的地。它具有必须遵循的路径,此外,还一直调整其速度和方向(航向,髓,堤)。 我能否请您提供以下信息: 什么样的曲线,用来平滑地插入对象 什么公式来使用可靠的插值,在那里我可以控制移动oject的速度,曲线节之间的过渡将是无缝 应从3D创作应用程序导出哪些信息 我应该为此使用四元数slerp()吗? 如果您知道一本有效地涵盖了该主题的书,那将使您收获最多。谢谢。

3
在游戏开发中最常见的样条曲线是什么?
在此列出在游戏开发中发现的最常见的样条曲线,该方法需要对曲线进行插值的点数以及如何构建允许对曲线点进行插值的数据类型。示例:贝塞尔曲线,B样条曲线,三次样条曲线等。 PS:我将其作为社区Wiki,以便我们可以列出各种样条插值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.