在 Shader 中使用四元数

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 一篇对四元数的翻译




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值