Kro*_*tan 5 cg transform hlsl unity-game-engine geometry-surface
在表面着色器中,给定世界的上轴(以及其他轴)、世界空间位置和世界空间中的法线,我们如何将世界空间位置旋转到法线空间中?
也就是说,给定一个向上向量和一个非正交的目标向上向量,我们如何通过旋转它的向上向量来变换位置?
我需要这个,所以我可以只受对象的旋转矩阵,这是我的顶点位置没有访问。
这是我想要做的图形可视化:
该图是二维的,但我需要为 3D 空间解决这个问题。
看起来您正在尝试以与new_up相同的旋转方式旋转pos。
使用此处找到的旋转矩阵,我们可以使用以下代码旋转pos 。这将在曲面函数或补充顶点函数中起作用,具体取决于您的应用程序:
// Our 3 vectors
float3 pos;
float3 new_up;
float3 up = float3(0,1,0);
// Build the rotation matrix using notation from the link above
float3 v = cross(up, new_up);
float s = length(v); // Sine of the angle
float c = dot(up, new_up); // Cosine of the angle
float3x3 VX = float3x3(
0, -1 * v.z, v.y,
v.z, 0, -1 * v.x,
-1 * v.y, v.x, 0
); // This is the skew-symmetric cross-product matrix of v
float3x3 I = float3x3(
1, 0, 0,
0, 1, 0,
0, 0, 1
); // The identity matrix
float3x3 R = I + VX + mul(VX, VX) * (1 - c)/pow(s,2) // The rotation matrix! YAY!
// Finally we rotate
float3 new_pos = mul(R, pos);
Run Code Online (Sandbox Code Playgroud)
这是假设new_up已标准化。
如果“目标正常”是一个常数,则R的计算可以(并且应该)每帧只发生一次。我建议在 CPU 端执行此操作并将其作为变量传递到着色器中。计算每个顶点/片段的成本很高,请考虑您实际需要的是什么。
如果你的pos是一个向量 4,只需对前三个元素执行上述操作,第四个元素可以保持不变(无论如何,在这种情况下它实际上没有任何意义)。
我远离可以运行着色器代码的机器,所以如果我在上面犯了任何语法错误,请原谅我。
| 归档时间: |
|
| 查看次数: |
1927 次 |
| 最近记录: |