首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于3D旋转的PVector标题()

用于3D旋转的PVector标题()
EN

Stack Overflow用户
提问于 2014-05-25 22:46:12
回答 2查看 1.8K关注 0票数 3

我想在PVector类中使用heading()函数,但我使用的是P3D,并且我的PVector有一个x、y和z。我如何重写这个函数,让它在3D空间中工作?我的目标是做一些类似的事情:

代码语言:javascript
复制
      size(100, 100, P3D);
      PVector v = new PVector(.2, .11, .54);
      rotate( v.heading() ); //set rotation from PVector named v
      line(0, 0, 10, 0); //draw line that will be rotated in correct direction

上面的代码没有在3D空间中显示正确的旋转,因为v.heading()只适用于2D坐标空间。如何使用rotateX()、rotateY()、rotateZ()来实现这一点?如果可能的话,我想避免使用四元数,而使用旋转函数。

提前感谢!!

EN

回答 2

Stack Overflow用户

发布于 2014-05-25 23:49:54

在2D中使用heading()函数是将2D笛卡尔坐标(x,y)转换为2D极坐标(半径、角度)。极坐标的3D版本是spherical coordinates

3D点P可以表示为三个线性坐标(x,y,z)或一个线性坐标和两个角度(rho,θ,phi)。Rho是向量的长度,θ是x-y平面上的角度,phi是z平面上的角度。这些方程描述了转换过程:

rho = sqrt(x^2 + y^2 + z^2)

phi = arccos(z/rho)

theta = arctan(y/x)

您应该能够使用这些角度来使用rotateX()等函数。请注意,这使用了角度名称theta和phi的数学约定;在物理学中,这些标签与上面显示的相反。

票数 4
EN

Stack Overflow用户

发布于 2016-08-04 08:28:29

kevinsa5所说的,除了使用反正弦函数来获得高程。使用方位角的atan2函数(或者更好,只使用矢量的2D方向方法)。并使用矢量的mag方法来确定其大小。

代码语言:javascript
复制
rho = v.mag();

phi = asin(v.z/rho);

theta = atan2(v.y, v.x);

向后工作,思考"X -Y- Z“并尝试:

代码语言:javascript
复制
PVector p = new PVector(v.mag(), 0, 0); // X

rotateY3D(p, phi); // Y

rotateZ3D(p, theta); // Z

然后将p与原始v进行比较。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23856489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档