Quantcast
Channel: Cocos中文社区 - 最新主题
Viewing all articles
Browse latest Browse all 88737

四元数旋转 捕鱼

$
0
0

@bydreamxxx 写道:

用贝塞尔曲线实现了鱼的游动 但是只能在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);

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

帖子: 3

参与者: 1

阅读整个主题


Viewing all articles
Browse latest Browse all 88737

Trending Articles