Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 三维到二维点转换_C#_3d_2d_Point_Projection - Fatal编程技术网

C# 三维到二维点转换

C# 三维到二维点转换,c#,3d,2d,point,projection,C#,3d,2d,Point,Projection,我正在尝试将3D点绘制到2D曲面上(我目前正在使用SDL.NET作为我的“游戏引擎”)。曲面大小为800x400像素,三维坐标范围为-4000到4000。我的视图将始终是自上而下的视图,不会有任何相机移动。有人能提供一些本地c#、伪代码或简单的解释来将三维空间中的坐标转换为二维曲面吗 同时,我还点了一些别人告诉我的,可以解决我很多数学上的缺点的东西……希望:)你需要考虑我的观点。根据您的视角,绘图点会有所不同。如果您想要正交透视图(基本上没有透视图),您可以这样运行矩阵变换: 其中,a表示3D

我正在尝试将3D点绘制到2D曲面上(我目前正在使用SDL.NET作为我的“游戏引擎”)。曲面大小为800x400像素,三维坐标范围为-4000到4000。我的视图将始终是自上而下的视图,不会有任何相机移动。有人能提供一些本地c#、伪代码或简单的解释来将三维空间中的坐标转换为二维曲面吗


同时,我还点了一些别人告诉我的,可以解决我很多数学上的缺点的东西……希望:)

你需要考虑我的观点。根据您的视角,绘图点会有所不同。如果您想要正交透视图(基本上没有透视图),您可以这样运行矩阵变换:

其中,a表示3D点,b表示2D点结果。 向量s是任意比例因子,c是任意偏移量

下面是另一篇类似的帖子,有一个很好的答案:

这里有更多的信息


你需要考虑你的观点。根据您的视角,绘图点会有所不同。如果您想要正交透视图(基本上没有透视图),您可以这样运行矩阵变换:

其中,a表示3D点,b表示2D点结果。 向量s是任意比例因子,c是任意偏移量

下面是另一篇类似的帖子,有一个很好的答案:

这里有更多的信息

注: 这是一个巨大的文本墙,我完全沉浸在许多重要的东西上——但我的意图只是一个概述……希望这里的一些术语/概念能让你更好地在网上搜索适当的块

如果你走在“生命作为一个点”的道路上,这会有所帮助:

这是一个很好的三维点:

var happyPoint = new Point(0, 0, 0);
这是它的伙伴,与他的朋友有关:

var friendlyPoint = new Point(1, 0, 0);
现在,让我们将这两点称为“模型”——我们将使用“模型空间”一词来讨论单个三维结构中的点(如房子、怪物等)

然而,模型并不是生活在真空中……通常更容易将“模型空间”和“世界空间”分开,以使模型调整更容易(否则,所有模型都需要具有相同的比例、相同的方向等,再加上在3d建模程序中对其进行操作是不可能的)

因此,我们将为我们的“模型”定义一个“世界变换”(好的,2点是一个蹩脚的模型,但它仍然是一个模型)

什么是“世界变革”?简言之:

  • 世界变换
    W=T X R X S
    ,其中
  • T=平移-即沿X、Y或Z轴滑动
  • R=旋转-相对于轴旋转模型
  • S=缩放-沿轴调整模型大小(保持模型中的所有相对点)
我们在这里简单介绍一下,只需将我们的世界变换定义为标识矩阵-基本上,这意味着我们不希望它平移、旋转或缩放:

world = [
          1 0 0 0
          0 1 0 0
          0 0 1 0
          0 0 0 1
        ];
我强烈建议你复习一下你的矩阵数学,尤其是乘法和向量->矩阵运算,它在3D图形中经常使用

聪明地跳过了实际的矩阵乘法,我只告诉你,将“世界变换”和模型点相乘,最终又得到了我们的模型点(尽管在这个有趣的新四维向量表示中,我在这里不涉及)

所以我们有了我们的观点,并且我们绝对地将它们定位在“空间”…现在呢

那么,我们从哪里看呢?这就引出了
视图变换
摄影机投影
的概念-基本上,这只是另一个矩阵乘法-观察:

假设我们有一个点X,在……哦,(4-2)左右:

从原点(0)的角度来看,X在(42)-但是我们把相机放到右边

 |
 |
 |
 |    
 |    X         >-camera
 |
 ------------------------
X相对于相机的“位置”是什么?可能更接近(09)或(90),这取决于相机的“向上”和“向右”方向。这就是视图变换的含义——将一组3D点映射到另一组3D点,以便从观察者的角度来看它们是“正确的”。对于自上而下的固定摄影机,观察者将位于天空中的某个固定位置,所有模型都将相应地变换

那我们来画画吧

不幸的是,我们的屏幕还不是3D的,所以首先我们需要将这一点“投影”到2D表面上。投影是…嗯,它基本上是一个映射,看起来像:

(x, y, z) => (x, y)
可能的投影数量几乎是无限的:例如,我们可以通过
Z
X
Y
坐标上移动:

func(x, y, z) => new point2d(x + z, y + z);
通常,您希望该投影模拟人类视网膜在观看3D场景时的投影,因此我们引入了视图投影的概念。有一些不同的视图投影,如正交的定义的YawPitchRoll,以及定义的透视/视野;其中每一个都有两个关键的数据位,您需要正确地构建投影

例如,基于透视/视野的投影需要:

  • “眼球”的位置(即屏幕)
  • 你的“眼球”能够聚焦的距离有多远(“远剪裁平面”)
  • 你的角度视野(即,伸出手臂,就在周边视觉的边缘)
  • 您正在通过的“镜头”(通常是您的scre)的宽高比
    func(x, y, z) => new point2d(x + z, y + z);
    
    \-----------------/
     \               /
      \             /
       \           /
        \         /
         \-------/
    
     ___________________
    |   _____________   |
    |  |             |  |
    |  |             |  |
    |  |             |  |
    |  |             |  |
    |  |             |  |
    |  |_____________|  |
    |___________________|
    
    \-----------------/
     \               /
      \ o<-pt       /
       \           /
        \         /
         \-------/
    
     ___________________
    |   _____________   |
    |  |             |  |
    |  |             |  |
    |o |             |  |
    |^---- pt        |  |
    |  |             |  |
    |  |_____________|  |
    |___________________|
    
     ___________________
    |   _____________   |
    |  |             |  |
    |  |             |  |
    |>>>o <- pt is   |  |
    |  |    shifted  |  |
    |  |             |  |
    |  |_____________|  |
    |___________________|