第 17 课:Rotation About an arbitrary Axis
我的解:| 部分 | 几何含义 | 作用 |
我的解
cbuffer Uniforms : register(b0) {
float iTime;
float4x4 viewMatrix;
float4x4 projectionMatrix;
};
struct VSInput {
float3 position : Position;
};
struct VSOutput {
float4 position : SV_Position;
float3 wolrdPos : POSITION0;
};
VSOutput main(VSInput input) {
VSOutput output;
float angle = iTime;
float3 axis = normalize(float3(1.0, 1.0, 0.0));
float3 p0 = input.position.xyz + float3(1.0, -1.0, 0.0);
float3 v_para = dot(p0, axis) * axis;
float3 v_perp = p0 - v_para;
float3 v_after = v_para + v_perp * cos(angle) + cross(axis, v_perp) * sin(angle);
// setPosition3D
float3 pos3D = v_after;
float4 viewPos = mul(viewMatrix, float4(pos3D, 1.0));
output.position = mul(projectionMatrix, viewPos);
output.wolrdPos = pos3D;
return output;
}
复盘笔记
- | 部分 | 几何含义 | 作用 |
- | ------------------------------ | ---------------- | ----------------------------------- |
- | v_\parallel | 向量在旋转轴上的投影 | 不参与旋转,只是“把结果沿轴方向抬回去”——可以理解为“平移回原位置” |
- | v_\perp \cos\theta | 垂直于轴的那部分在原方向上的投影 | 类似“x 轴方向”——旋转后仍保留原方向分量 |
- | (n \times v_\perp)\sin\theta | 垂直于 v_\perp的分量 | 类似“y 轴方向”——旋转时的切线分量 |