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