跳到主要内容
← Vertex Transformations

Vertex Transformations

Rotation About an arbitrary Axis

| 部分 | 几何含义 | 作用 |

实时渲染 · 网格 HLSL

第 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 轴方向”——旋转时的切线分量 |