2

我正在寻找一些代码示例(最好是 C#)或简单的 .Net 函数库,便宜或免费,我可以使用它来将 3D 事物转换为它的 2D 透视投影,给定指定的相机位置等。

我进行了搜索和搜索,但我发现的所有内容似乎都使用了主要的图形框架或非常面向设备,或两者兼而有之。我想要一些纯软件和独立于设备的东西,并且可以与 .Net 2 一起使用。

但我确实想要带有相机视图的真实透视投影,而不仅仅是一些扭曲图像的 2D 图像转换,因此它看起来有点透视。

编辑:

感谢那些已经回答的人。就像我说的那样,我已经花了很多时间搜索,所以我并不感到惊讶(到目前为止)答案是我正在寻找不存在的东西。

在回答有关我为什么对参与某些主要软件包过敏的问题时,原因很简单,就是“保持简单”规则。对我来说,我想做的是一点点图形操作,我无法理解必须熟悉一个实现 10,000 多个功能的大型多功能包的想法,以便我可以做我的一个小功能。

编辑 2 - 主要用于 Miky:

以下是伪程序员哲学的一些杂乱无章的尝试,以证明我希望避免参与任何大型而复杂的程序包,而我想要的只是一个非常具体的功能。不要浪费时间阅读这篇文章,除非你真的无事可做......

Miky 正确地指出,.Net 框架有无数的功能,但我选择学习如何使用它,即使我永远不会使用其中 1% 的功能的 1%。是的,但我正在使用其中的数百个,这一切都值得。(单独的内存管理是一个死的功能。)

我还在为 WinForms 使用 Developer Express 包,它还包含成千上万个我永远不会使用的函数。但我确实使用了功能区菜单、停靠面板、网格和树视图以及许多其他功能,可能有一百个或更多,这一切都值得。

我还在为 WinForms 产品使用 MindFusion 图表,它包含数百个我永远不会使用的功能,但我确实使用了支持创建组织结构图和平面图以及移动节点并将它们链接在一起并重新格式化的功能图表、放大和缩小以及撤消……也许我正在使用几十个功能,这一切都值得。

所以这里我有一个包含 170,000 行代码并且高度依赖 .Net Framework 和 Developer Express 并且在某种程度上依赖于 MindFusion 的程序,现在我想做一点点 3D 透视渲染。事实上,它甚至不是真正的 3D -我想做的是显示从斜角看到的 2D 图像(平面图)。我想将平面图堆叠在一起以代表一栋透明的多层建筑,可能具有夸大的平面图间距,并允许用户指定他/她是否想从一个角落或正面看伪建筑-在或另一个角落,以及相机的高度。

而已。我认为我需要的是一两个 C# 方法,它们可以让我渲染这些漂浮在空间中的 2D 平面图,就好像它们是 3D 一样,因为它们相对于相机倾斜,并且可以移动相机。而已。

不管对错,我相信如果我开始学习一个主要的 3D 宇宙创建包或一个面向设备/性能的图形系统,那么我最终会花费比这个功能更多的时间。而且我绝对不想用永远不会使用的兆字节模块来膨胀我的程序的运行时占用空间。

但我非常感谢这个问题收到的所有建议和关注。

4

3 回答 3

3

基本上,将 3D 形状投影到 2D 屏幕上只是意味着使用几何来说明,如果我的屏幕是进入 3D 世界的窗口,那么该对象中的每个点会出现在屏幕上的什么位置?

在此处输入图像描述

如果您知道您希望用户的眼睛似乎远离屏幕的距离,您可以用相似的三角形计算出答案:

在此处输入图像描述

数学只是:

sx = tx * 距离 / ty

于 2013-03-21T20:05:09.990 回答
1

虽然我可以想出一些你不想依赖微软特定框架或事件 OpenGL 的原因,但我真的很难理解你对游戏 3D 库的看法。

问题是大多数 3D 库都考虑了游戏开发人员,因为它们构成了用户群的大部分。

因此,如果您倾向于对最后的限制宽大处理,您的可能性会略微增加。然而,一个问题仍然存在。

没有人真正关心 .NET 的 3D 库。那是因为 .NET 已经有 DirectX、XNA、OpenGL 了。而且,由于大多数 3D 库用户首先追求性能,因此重点是 C 或 C++。

因此,这使您可以在非托管领域中进行选择,包括以下库:

关于您的编辑:

我认为在这种情况下,最好的办法是对抗你的抑制并加快了解其中一个令人生畏的软件包的基础知识。这样想:

.NET 框架有 10,000 多种方法,如果您想创建一个简单的应用程序,该应用程序显示一个带有更新标签上打印文本的按钮的窗口,那么学习一些必要的(一些基本原理和子集)仍然会更容易功能)来实现这一点,而不是尝试寻找一个轻量级的库,该库旨在显示带有按钮和文本框的窗口。

上面的类比适用于所有主要的 3D 库。他们感到害怕的部分原因可能是因为它是全新的领域,也因为 3D 图形不是一个超级简单的概念来掌握。因此,任何实现 3D 库的人都希望尽可能多地公开功能,以使开发人员的生活更轻松(而不是更难)。

好消息是,学习 OpenGL 或 DirectX 的基础知识并不难。使用.NET可能更容易学习/使用 DirectX 。长期学习 OpenGL 可能更适合您,因为它更便携。两者都具有可用于帮助人们入门的许多资源的优势。

所以,咬紧牙关!不要重新发明轮子,也不要害怕承担很大的依赖(当你知道这是正确的时候)!继续编写您的第一个支持 3D 的基本应用程序。你会感觉好多了

于 2013-03-21T20:45:20.127 回答
1

我不知道这样的图书馆。通常的方法是使用齐次坐标。这可行,但非常抽象。

为了解决这个问题,我首先使用 SlimDx 或 Xna 附带的数学库编写程序。

一旦成功,将您需要的函数移植到您自己的 C# 代码中。无论您从哪个库开始,变换和透视矩阵函数都是相同的,它们的定义可以在 Internet 上找到。

于 2013-03-21T20:21:14.253 回答