【发布时间】:2018-01-16 23:15:24
【问题描述】:
我想相对于对象的局部轴施加一个向前的力,但我使用的引擎只允许我在全局轴上施加一个力。
我可以作为四元数访问对象的全局旋转。但是,我不熟悉使用 quats(通常未经高级数学训练)。是否有足够的信息来抵消沿所需轴施加的力?怎么样?
例如,要在全球范围内前进,我会这样做:
this.entity.rigidbody.applyForce(0, 0, 5);
但要保持沿对象的局部轴施加的力,我需要根据对象的旋转 quat 以不同的方式沿轴分配施加的力,例如:
w:0.5785385966300964
x:0
y:-0.815654993057251
z:0
我研究了四元数试图弄清楚这一点,但观看有关它们是什么以及为什么使用它们的视频并没有帮助我弄清楚如何实际使用它们,甚至开始弄清楚如何应用这里需要的偏移量。
到目前为止,我尝试过的只是对如何做的猜测,但这是错误的:
Math.degrees = function(radians) {
return radians * 180 / Math.PI;
};
//converted this from a python func on wikipedia,
//not sure if it's working properly or not
function convertQuatToEuler(w, x, y, z){
ysqr = y * y;
t0 = 2 * (w * x + y * z);
t1 = 1 - 2 * (x * x + ysqr);
X = Math.degrees(Math.atan2(t0, t1));
t2 = 2 * (w * y - z * x);
t2 = (t2 >= 1) ? 1 : t2;
t2 = (t2 < -1) ? -1 : t2;
Y = Math.degrees(Math.asin(t2));
t3 = 2 * (w * z + x * y);
t4 = 1 - 2 * (ysqr + z * z);
Z = Math.degrees(Math.atan2(t3, t4));
console.log('converted', {w, x, y, z}, 'to', {X, Y, Z});
return {X, Y, Z};
}
function applyGlobalShift(x, y, z, quat) {
var euler = convertQuatToEuler(quat.w, quat.x, quat.y, quat.z);
x = x - euler.X; // total guess
y = y - euler.Y; // total guess
z = z - euler.Z; // total guess
console.log('converted', quat, 'to', [x, y, z]);
return [x, y, z];
}
// represents the entity's current local rotation in space
var quat = {
w:0.6310858726501465,
x:0,
y:-0.7757129669189453,
z:0
}
console.log(applyGlobalShift(-5, 0, 0, quat));
不要嘲笑我对如何计算偏移量的可怕猜测:P 我知道它甚至不接近,但我的数学真的很差
【问题讨论】:
-
查看转换quaternions to Euler angles 以获取对象的局部坐标轴。
-
@PatrickRoberts 是否可以在没有转换的情况下做到这一点?这是一个需要最大效率的场景(游戏代码,每刻都发生)。
-
最简单,将力向量从局部坐标系转换为世界坐标系,并在全局中施加力。
-
@minorlogic 如果我知道该怎么做,我就不会问这个问题
-
只需应用从本地到全局的转换的旋转部分。为了帮助它,我需要更多信息,你如何存储你的对象转换
标签: javascript algorithm quaternions