【问题标题】:is there any similar function in numpy(python) with Vector3.TransformCoordinate in SharpDX (c#)?numpy(python) 中是否有任何与 SharpDX (c#) 中的 Vector3.TransformCoordinate 类似的函数?
【发布时间】: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()

【问题讨论】:

    标签: python c# numpy sharpdx


    【解决方案1】:

    来自TransformCoordinate的文档

    此方法通过矩阵sourceMatrix对源向量、源(x,y,z,1)或向量参数中的所有向量进行变换,将结果投影回w = 1。

    即您将在 w 字段中创建一个向量 4

    pos4d = np.array([
        pos2d[0] / width * 2 - 1,
        pos2d[1] / height * 2 - 1,
        0,
        1
    ])
    

    然后与变换相乘,将 x/y/z 域与 w-field 相除

    camPosTmp = viewProjectionMatrix * pos4d
    camPos = np.array([
        camPosTmp[0] / camPosTmp[3]
        camPosTmp[1] / camPosTmp[3]
        camPosTmp[2] / camPosTmp[3]
    ])
    

    请注意,我的 Python 已经生锈了,所以这是对如何编写它的最佳猜测。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 2014-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多