我的数学不是很好但是我试图学习虽然..
我试图做的是给我的游戏导弹一个螺旋火箭效果,但我不知道如何使用Sin和Cos来使螺旋在正确的方向上发挥作用..
顺便说一句,这是一款3D游戏:
问题在于,根据导弹朝向哪个方向,螺旋看起来会变形或变平......
什么是以数学方式计算基于导弹X,Y,Z /方向的螺旋线的最佳方法?我一直试图弄清楚它很长时间:/
非常感谢!
double x = radius * Math.cos(theta);
double y = radius * Math.sin(theta);
double z = radius * Math.cos(theta);
location.add(x,y,z);
missile.shootFlame(location,2);
location.subtract(x,y,z);
答案 0 :(得分:1)
基础载体
你需要导弹的整体方向为 3D 向量,让它称之为W
。从中你需要获得另外两个彼此垂直的向量U,V
。要获得它们,您可以利用跨产品。所以:
制作W
单位向量
只需W = W/|W|
所以:
l=sqrt(Wx*Wx+Wy*Wy+Wz*Wz);
Wx/=l;
Wy/=l;
Wz/=l;
选择U
作为与[{1}}不平行的任何方向
所以从W
开始,如果U=(1.0,0.0,0.0)
选择U==W
。如果你有任何东西需要锁定以将其用作U方向,那么坐标系将不会随时间旋转(如Up,North,Sun ...)
U=(0.0,1.0,0.0)
应该是单位,所以如果不正常化就像在#1
计算U
它应与V
垂直,因此请使用cross product:
U,W
单位向量的交叉乘积也是单位向量,因此无需标准化。
重新计算V = W x U
当我们手动选择U
时,我们需要确保它也与U
垂直,所以:
V,W
现在我们有3个垂直基矢量,其中U = V x W
位于螺旋螺钉的平面内,U,V
是整个运动方向。
如果您不知道如何计算叉积,请参阅:
现在Helix很简单:
<强>定义强>
所以我们需要[edit2]
,我们需要半径U,V,W
,移动速度r [units]
,角速度v [units/s]
时间o [rad/s]
和开始位置{{ 1}}。
Helix等式
我们需要的是等式返回实际位置的时间所以:
t>=0.0 [s]
改写为标量:
P0
[edit1]因为您无法正确复制粘贴和/或正确更改我的代码......
ang = o*t;
P(t) = P0 + U*r*cos(ang) + V*r*sin(ang) + W*v*t;
这应该为您提供行程线性距离的螺旋点
ang = o*t;
x = P0x + Ux*r*cos(ang) + Vx*r*sin(ang) + Wx*v*t;
y = P0y + Uy*r*cos(ang) + Vy*r*sin(ang) + Wy*v*t;
z = P0z + Uz*r*cos(ang) + Vz*r*sin(ang) + Wz*v*t;
螺丝:
Vector w = loc.getDirection();
double wX = w.getX();
double wY = w.getY();
double wZ = w.getZ();
double l = Math.sqrt((wX * wX) + (wY * wY) + (wZ * wZ));
wX = wX / l;
wY = wY / l;
wZ = wZ / l;
w = new Vector(wX,wY,wZ); // you forget to change W and use it latter ...
Vector u = new Vector(0, 1.0, 0);
if (Math.abs(wX)<1e-3) // if U and W are the same chose different U
if (Math.abs(wZ)<1e-3)
u = new Vector(1.0, 0.0, 0);
Vector v = w.crossProduct(u);
u = v.crossProduct(w);
double radius = 10; // helix radius [units]
double speed = 2.00; // movement speed [unit/s]
double omega = 0.628; // angular speed [rad/s]
//double omega = 36.0; // angular speed [deg/s]
for (double i = 0; i < 100; i += 1.0) // time [s]
{
double angle = omega * i; // actual screw position [rad] or [deg]
double x = u.getX() * radius * Math.cos(angle) + v.getX() * radius * Math.sin(angle) + wX * speed * i;
double y = u.getY() * radius * Math.cos(angle) + v.getY() * radius * Math.sin(angle) + wY * speed * i;
double z = u.getZ() * radius * Math.cos(angle) + v.getZ() * radius * Math.sin(angle) + wZ * speed * i;
loc.add(x,y,z); // What is this? should not you set the x,y,z instead of adding?
//do work
loc.subtract(x,y,z); // what is this?
}
不要忘记重新输入/输出正确的speed*imax = 2.0*100.0 = 200.0 units
行(我选择[rad],因为我的数学库使用的是我所使用的)。不确定如果我正确地翻译到你的环境可能会有像omega*imax/(2*Pi) ~= 0.628*100.0/6.28 ~= 10 screws // in case of sin,cos want [rad]
omega*imax/360.0 = 36.0*100.0/360 = 10.0 screws // in case of sin,cos want [deg]
有不同名称的错误或omega
可以在中间或仅变量声明等上完成,我不知道因为我不编码它