我想在PVector类中使用heading()函数,但是我正在使用P3D并为我的PVector使用x,y和z。我将如何重新编写此功能以使其适用于3D空间?我的目标是做类似的事情:
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
由于v.heading()仅适用于2D坐标空间,因此上面的代码无法在3D空间中显示正确的旋转。如何使用rotateX(),rotateY(),rotateZ()实现此目的?我想尽可能避免使用四元数,而使用旋转函数。
提前致谢!!
最佳答案
在2D中使用heading()
函数会将2D笛卡尔坐标(x,y)转换为2D极坐标(半径,角度)。极坐标的3D版本是spherical coordinates:
3D点P
可以表示为三个线性坐标(x,y,z)或一个线性坐标和两个角度(rho,theta,phi)。 Rho是向量的长度,theta是x-y平面中的角度,phi是在z平面中的角度。这些等式描述了转换:rho = sqrt(x^2 + y^2 + z^2)
phi = arccos(z/rho)
theta = arctan(y/x)
您应该能够使用这些角度使用rotateX()等函数。请注意,这对角度名称theta和phi使用了数学惯例;在物理学中,这些标签与上面显示的相反。