问题标签 [vectormath]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
52 浏览

android - 高于 maxVelocity 将方向更改为对角线,解决方法

AndroidVelocityTracker课程中的缺陷是,如果您在 X 方向上的速度超过 maxVelocity,则它会更改为等于 maxVelocity 并且对于 Y 方向相同。但是,这意味着如果我们以 20° 角和 200 的速度前进,并且我们的 maxVelocity 为 20。我们的速度在 45° 角处更改为 20*sqrt (2)。正确的答案是通过实际速度和 maxVelocity 的比率来缩放 mXVelocity 和 mYVeloicity。

我的问题是我必须求助于两个平方根来修复这个错误吗?

速度是物体的方向和速度。由于达到最大速度而改变方向必须被视为缺陷。这也明显导致了一个缺陷,即对角线速度比正交速度快。

有问题的代码类似于:

为了解决这个问题,我使用:

有没有办法避免双平方根?或者其他可以修复这个棘手错误的东西?


更新:

答案似乎是根据最大速度超过最大速度的一个组件来缩放两个组件。这并不是严格按照实际速度进行缩放,但它通过简单的数学解决了大部分问题。

0 投票
1 回答
251 浏览

vector - 如何确定点是否在倾斜的圆锥截头体内

我正在尝试确定一个点是否在 3D 空间中的点和圆之间形成的椭圆锥内。圆锥是椭圆体,因为该点不垂直于圆心。见下图:

在此处输入图像描述

所以我知道:

  1. 形成圆锥顶点的点的位置:x
  2. 圆心的位置:c
  3. 圆的半径:r
  4. 我想确定它们是否在圆锥内的各个点的位置:y,z

这是同一图表的俯视图:

在此处输入图像描述

我不关心圆锥体的底部 - 我希望圆锥体中包含的点有效地拉伸到无穷大。

我已经找到了计算一个点是否在给定长轴/短轴的椭球锥内的公式,但是当椭球锥是由一个角度的圆形成时,很难弄清楚如何做到这一点。

谢谢你的帮助!

0 投票
1 回答
86 浏览

c++ - 3D 弹丸 - X 和 Z 计算错误?

我正在构建一个小型物理引擎,它以给定的速度、重力速度和时间间隔发射弹丸,并在每个时间间隔跟踪和显示速度/位置矢量。

目前,当我运行我的程序时,我的y坐标更新得很好。但是我的坐标xz坐标的作用相同,我很确定我的z坐标计算不正确。(但我可能是错的)

x对于和z轴上的位置和速度矢量,这个问题是相同的。

这是我的代码:

如果有帮助。这是我的任务:

发射速度矢量为 (10.0,14.14,- 10.0) 的射弹的 3D 轨迹。时间步长 = 0.01 秒。重力矢量为 (0.0, -9.81, 0.0)。

出于演示目的,在控制台上显示位置矢量和速度矢量。

0 投票
0 回答
35 浏览

plane - 试图解释 VMF 文件

我在stackoverflow上阅读了一个关于类似主题的问题,我有部分解决我的问题,让我解释一下问题是什么;
我需要知道每个块的位置,在我阅读提问者的问题上提到“平面”的 3 个向量是位置的决定因素,但我阅读了那里的 1 个答案,还检查了网页提问者提供了,我无法完全理解,谁能帮我简化一下,这让我无法解析 VMF 文件。

0 投票
1 回答
8160 浏览

unity3d - 将向量值相乘的最简单方法是什么?

我有一个愚蠢的问题。大约 10 年前,我参加了一个向量数学课,我可以发誓我记得一个操作,它允许我将向量的值相乘,如下所示:

现在在查看我所有的笔记,以及我在网上可以找到的所有内容时,看起来这根本不是一个常见的操作。当然我可以写一个函数来做到这一点:

到目前为止,我至少发现了一些这样的操作会有所帮助的实例,所以我不确定为什么它不会以某种形式存在。所以,我想我有两个问题:

  1. 有没有比制作自己的自定义函数更简单的方法来获得我正在寻找的结果?
  2. 一开始就没有像这样的标准向量运算有什么原因吗?

非常感谢您的宝贵时间!

0 投票
1 回答
3818 浏览

math - 在 3D 中计算给定旋转的前向向量

给定一个欧拉角向量 3,如何在数学上找到物体所面对的方向。

换句话说,Unity 是如何计算“transform.forward”向量的?

0 投票
1 回答
1227 浏览

c# - Vector3.SqrMagnitude 似乎不准确

我有一个函数可以返回 NavMesh 路径的总长度,使用Vector3.SqrMagnitude来避免Vector3.Distance中 Sqrt 计算的开销:

当路径只有两个点时,计算似乎很好,但是在 3 点或更多点时,长线返回的值总是小于只有 2 点的短线返回的值。

第一张图片显示的距离是 3848,第二张图片显示的距离是 3419,尽管路径要长得多。

在此处输入图像描述 在此处输入图像描述

Vector3.Distance 适用于任意数量的点。

我错过了什么吗?

0 投票
1 回答
1033 浏览

c# - 相对于方向的统一角度和位置

我正在尝试围绕一个点创建一个矢量点的“星形”,它们之间的角度恒定,源和命中点之间的原始线(见图)我通过创建具有小偏移量的新矢量来完成从原文:

在此处输入图像描述

当鼠标之间的角度接近 0 或 180 时,这可以正常工作,但在其他角度当然不行:

在此处输入图像描述

我知道我可能需要 Quaternion 类将球体和鼠标点之间的角度应用于方向向量,但不能完全弄清楚,例如

如何始终保持红线与黄线成n角?

0 投票
2 回答
1832 浏览

unity3d - 当一个向量的方向未知时,两个向量之间的交点

问题:我有两个向量。我知道一个向量的起点,它的方向,它的大小。我知道另一个向量的起点及其大小。我需要找到第二个向量的方向以及相交的位置。

是否可以使用给定的参数找到交点?如果是,那怎么办?

应用:我想根据玩家移动的速度找到玩家所在的位置,并在找到玩家的那一刻向他发射子弹,同时考虑子弹到达该虚拟目标所需的时间位置。

0 投票
0 回答
1099 浏览

c++ - 更快的四面体-四面体相交

对于我的一个项目,我需要可靠地检测 3D 空间中两个四面体之间的交叉点。我不需要点/线/面来知道是否存在交叉点。触摸也被认为是交叉点,但普通的三角形面不被认为是交叉点。经过一番努力以尽可能快地实现这一目标,我的解决方案变得如此可怕:

  1. 让有四面体v0,v1

    每个四面体有 4 个三角形t[4],每个三角形有 3 个点p0,p1,p2和法向量n

  2. 计算两个四面体所有 4 个面的平面

    所以平面上的任何点p都由方程给出

    n飞机的法线在哪里。众所周知,这归结为计算d

    对于每个四面体的每个三角形

  3. 测试 v0,v1 之间三角形与三角形交点的任意组合

    所以只需在所有 16 种组合之间循环并使用三角形与三角形相交。

三角形v0.t[i]与三角形的v1.t[j]交点归结为:

  1. 计算平面之间的交点

    这显然是光线(对于非平行平面),所以平面法线的简单叉积将给出光线方向

    现在只需找到属于两个平面的交点。直接从法线的叉积利用行列式计算,光线计算如下:

    有关更多信息,请参阅:

  2. 编译每个三角形的三角形射线交点的有符号距离间隔

    所以简单地计算射线和三角形的每条边线之间的交点,记住最小和最大距离pos。我们不需要实际点,只需要pos线/射线相交返回的参数的标量距离。

  3. 检查两个三角形的范围是否重叠

    如果重叠而不是v0,v1相交...如果所有 16 个测试都没有发生重叠,v0,v1则不相交。

如您所见,需要计算很多东西。我的线性代数和矢量数学知识仅限于我使用的东西,所以很有可能有更好的方法。我尝试了很多方法来缓解这个问题,但没有任何运气(比如使用 bbox、bsphere、使用更简单的测试,利用光线和三角形边缘都在同一平面上等),但结果要么更慢,甚至错误(不算数)边缘情况正确)。

这是我实际的C++实现:

它是一个更大的计划的一部分。这_zero只是基于最小细节大小的零阈值。_fac3是三角形,_vol4是四面体。pnt.pnt.dat[]点和三角形都从fac.dat[]动态列表中索引。我知道这很奇怪,但它背后有很多事情要做(比如空间细分到片段等等,以加速它用于的过程)。

是和产品(这取决于它vector_mul(a,b,c)是否是向量)。a=cross(b,c)a=dot(b,c)c

我宁愿避免每个三角形/四面体的任何预先计算的值,因为即使现在这些类已经拥有相当多的信息(如父级、使用计数等)。而且由于我绑定到 Win32,因此内存仅限于左右1.2 GB,因此任何额外的东西都会限制可用网格的最大大小。

所以我正在寻找的是这些中的任何一个:

  1. 如果可能的话,一些数学或编码技巧来加速当前的方法
  2. 不同的更快的方法

我绑定到BDS2006 Win32 C++,宁愿避免使用第 3 方库。

[Edit1] 样本数据

这是四面体点云作为测试的样本数据:

来自is normal的p?点索引是正常的符号(如果三角形是共享的,所以法线指向相同的方式)并且是来自的三角形的索引。这里有一个示例测试:0,3,6,9...pntnst[4]0,1,2,3,...fac

dbg_cnt交叉测试的计数器在哪里。对于这个网格,我得到了这个结果:

我调用了vols_intersect10 次测试以使测量时间足够长。在这个数据集中放置的四面体都不会相交(导致最高时间)。在导致此网格的实际过程(太大而无法发布)中,计数如下: