四元数旋转 捕鱼

用贝塞尔曲线实现了鱼的游动 但是只能在x y上转角正常
x z轴的角度加上后旋转混乱

看了一个教程用了2次B样条来实现
具体是根据三个控制点 求出切线 然后求大致法线 然后根据大致法线求Z 最后求出真实法线
然后根据切线 法线 Z构造Mat4 再转换成四元数

//插值点
Vec3 pt = getInterpolatedPt(_controlPts[_idx-2], _controlPts[_idx-1], _controlPts[_idx], _t);
//切线 求导得到
Vec3 ptDiff = -getInterpolatedPtDiff(_controlPts[_idx-2], _controlPts[_idx-1], _controlPts[_idx], _t);
ptDiff.normalize();
//法线
Vec3 fakenormal = (_controlPts[_idx-1] - _controlPts[_idx-2]) + (_controlPts[_idx-1] - _controlPts[_idx]);
fakenormal.normalize();

Vec3 z;
Vec3::cross(ptDiff, fakenormal, &z);
Vec3::cross(z, ptDiff, &fakenormal);

Mat4 mat;
mat.m[0] = ptDiff.x; mat.m[1] = ptDiff.y; mat.m[2] = ptDiff.z;
mat.m[4] = fakenormal.x; mat.m[5] = fakenormal.y; mat.m[6] = fakenormal.z;
mat.m[8] = z.x; mat.m[9] = z.y; mat.m[10] = z.z;

//mat.rotateY(CC_DEGREES_TO_RADIANS(180.f));
Quaternion quat, oldQuat;
Quaternion::createFromRotationMatrix(mat, &quat);
oldQuat = _sprite->getRotationQuat();
Quaternion::slerp(oldQuat, quat, 0.1f, &quat);

_sprite->setRotationQuat(quat);
_sprite->setPosition3D(pt);

谁能说说原理或者在贝塞尔曲线里怎么实现么? 对四元数理解太差了

在贝塞尔曲线里我想利用的是前后两点的变化来计算。。能不用控制点么?

竟然没有人回复。。。

问题解决没呢,遇到同样的问题了。有DEMO参考吗

3D的旋转有个万象锁的问题;不能直接旋转的,具体的计算公式和原理可以百度一下

默认四元数是 {x=0,y=0,z=0,w=1},计算你旋转角度的四元数, cc.quaternion_createFromAxisAngle(rotation3D, math.pi/2),然后矩阵计算出最终的 四元数,然后设置就可以了。 参考官方例子:TerrainTest.lua

1赞