首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象在旋转javascript时收缩。

对象在旋转javascript时收缩。
EN

Stack Overflow用户
提问于 2015-04-07 03:02:22
回答 1查看 143关注 0票数 1

为了学习这个过程,我一直在开发一个基本的游戏引擎,我的轮换功能也遇到了问题。

它的工作很好,除了物体收缩和似乎倒转。

这里有一个小提琴,它说明了我的观点。

我认为问题是在旋转代码中,它本身,但我不是积极的。

代码语言:javascript
复制
function Rotation(vec, rot){
if(Math.acos((vec.x + vec.y + vec.z -1)/2) === 0) { return vec; }

var qVec = new Quaternion(vec.x, vec.y, vec.z, 0);
qVec = Quaternions.multiply(qVec, rot);
qVec = Quaternions.multiply(qVec, rot.conjugate());
return new Vector3(qVec.x, qVec.y, qVec.z);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-08 15:11:50

几件事:

首先,旋转四元数是不归一化的,因此它的逆不等于它的共轭。四元数旋转的定义如下:

其中q是你旋转的矢量,p是你旋转的矢量,p'是最后旋转的矢量。

这是用q的逆来定义的,它被定义为conjugate(q) / magnitude(q)^2。在q被标准化的情况下,magnitude(q)^2 == 1,所以它和被共轭相乘一样。

还请注意这里的操作顺序。Quat乘法是non-commutative,所以它们的顺序很重要。

您可以通过规范化旋转四元数和修正操作顺序来解决这个问题:

代码语言:javascript
复制
var qVec = new Quaternion(vec.x, vec.y, vec.z, 0);
qVec = Quaternions.multiply(rot.normalize(), qVec);
qVec = Quaternions.multiply(qVec, rot.conjugate());
return new Vector3(qVec.x, qVec.y, qVec.z);

第二,你想把你的旋转quat定义为与你想要旋转的平面一样正常。在这种情况下,你想绕着x-y平面旋转。Z轴对这个平面是正常的,所以我们要定义z轴上的旋转矢量:

代码语言:javascript
复制
function update(){
    for(var i = 0; i < gameObjects.length; i++){
        gameObjects[i].rotation = euler(new Vector3(0, 0, frames/100));
    }
}

有了这些改变,我才能使盒子正确旋转。

(关于为什么它在上升/下降,我不能百分之百肯定。)仍在努力弄清楚这一点。

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

https://stackoverflow.com/questions/29482993

复制
相关文章

相似问题

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