在 Shader 中使用四元数

来源:互联网 发布:linux msleep函数 编辑:程序博客网 时间:2024/06/01 19:07

Shader 代码:

vec4 quaternionMul(vec4 q, vec4 r){vec3 qv = q.xyz;vec3 rv = r.xyz;return vec4(cross(qv, rv) + qv * r.w + q.w * rv,q.w * r.w - dot(qv, rv));}vec4 rotate(vec4 q, vec4 p){vec4 c = vec4(-1.0 * q.xyz, q.w);vec4 t = quaternionMul(q, p);return quaternionMul(t, c);}vec3 expand(float halfW, float halfH, vec3 viewRight, vec3 viewUp, float angle, vec3 localPos, mat4 worldMat){vec3 obj = halfW * viewRight + halfH * viewUp;vec3 forward = normalize(cross(viewRight, viewUp));angle = angle/2.0;vec4 p = vec4(obj, 0.0);vec4 r = vec4(forward * sin(angle), cos(angle));vec4 worldPosition = worldMat * vec4( localPos, 1.0 );return worldPosition.xyz + rotate(r, p).xyz;}


具体的主要看:rotate(r, p)

结合:    

A Translation for Quaternion 一篇对四元数的翻译




0 0
原创粉丝点击