【发布时间】:2021-04-27 09:17:26
【问题描述】:
我正在尝试将一些代码从 c# 转换为 python,但我有一个问题,Vector3.TransformCoordinate 在做什么,有没有类似的方法来完成这个功能?
这是我混淆的代码部分
using SharpDX;
namespace Test
{
internal class Program
{
public float[] DoSomething(float[] rawMatrix,Vector2 pos2D,float width,float height)
{
var viewProjectionMatrix = new Matrix();
for (var i = 0; i < 16; i++) viewProjectionMatrix[i] = rawMatrix[i];
viewProjectionMatrix.Invert();
var pos3D = new Vector3 {
X = pos2D.X / width * 2.0f - 1.0f,
Y = -(pos2D.Y / height * 2.0f - 1.0f),
Z = 0
};
Vector3.TransformCoordinate(ref pos3D, ref viewProjectionMatrix, out var camPos);
pos3D.Z = 1;
Vector3.TransformCoordinate(ref pos3D, ref viewProjectionMatrix, out var camPosOne);
var clipPos = camPosOne - camPos;
clipPos.Normalize();
return clipPos.ToArray();
}
}
}
这是我尝试翻译后的代码(当然,它不能按我的意愿工作)
import numpy as np
def do_something_in_python(raw_matrix: list[float], pos2d: list[float], width: float, height: float):
viewProjectionMatrix = np.linalg.inv(np.array(raw_matrix).reshape((4,4)))
pos3d = np.array([
pos2d[0] / width * 2 - 1,
pos2d[1] / height * 2 - 1,
0
])
camPos = viewProjectionMatrix * pos3d
pos3d[2] = 1
camPosOne = viewProjectionMatrix * pos3d
return np.linalg.norm(camPosOne - camPos).tolist()
【问题讨论】: