65.9K
CodeProject 正在变化。 阅读更多。
Home

科学与工程通用框架 - 第 7 部分: 虚拟现实

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.96/5 (103投票s)

2006年12月6日

CPOL

25分钟阅读

viewsIcon

194511

downloadIcon

15047

关于框架应用程序在虚拟现实中的应用

其他有用资源

Result of influence of physical field

目录

本次更新的目标

该框架起源于2002年。自2002年以来,一直使用OpenGL 3D图形。最近开发了WPF 3D图形版本。本文的此版本包含框架的WPF版本。该版本在第8章(WPF 3D图形)中进行了简要描述。

2010年8月21日:我扩展了WPF 3D图形版本。现在WPF版本实现了场与表面的交互(参见5.2,8)。

2010年11月19日:我为WPF 3D图形的WPF版本添加了纹理支持。

上次更新的目标

本文的前一次更新有一个非常令人失望的OpenGL错误。这个错误在我的电脑上没有发生。然而,它导致许多读者无法访问该软件。这个错误已经修复!除了第6章中的一张图片外,我没有更改以下文本。但是,软件有实质性更改。不幸的是,软件文档的更新尚未准备好。

引言

学习任何科学密集型软件都不容易。我的软件不仅科学密集型,而且还是跨学科的。为什么我们需要跨学科软件?让机械工程师从事机械,电工从事电力。然而,我知道一些工程问题,它们涉及机械、电力、热力、弹性现象,并且还需要使用星表。例如,飞机或航天器可能配备无线电系统、激光测高仪和天文导航系统。将这些问题合并到单个软件框架中,使我们能够更有效地解决这些问题。我发现,我的框架在高级数学家和IT专家中得到了最好的理解。他们都对高层次抽象有很好的理解。否则,许多工程师会低估IT专家。例如,许多工程师不知道电子商务中的高层次抽象。许多俄罗斯居民认为商务是

  • 称重;
  • 支付现金;
  • 包装。

许多工程师对电子商务软件的看法也差不多。许多无线电物理工程师认为偶极天线的磁场强度是

Dipole formula

优秀的IT专家将任何物理场视为一个对象。根据这种观点,有必要开发一个抽象的物理场。“我不需要任何抽象的场。我从事具体的实际问题。所以我不需要可变长度的数组,我使用Delphi和Fortran,”无线电物理工程师回答道。然而,这位无线电物理工程师从零开始解决新的具体实际问题。

本文是宣传这个通用工程框架的漫漫长路上的第一步。最好的宣传应该是易于理解的。人类的思维比抽象理论或方程更好地掌握虚拟现实。有时即使我也对自己的软件有所怀疑。然而,当我看到3D形状的良好行为时,我的疑虑就消失了。如果您尝试我的软件,您会注意到3D形状的机械运动以及它们与物理场的相互作用是正确的。本文的第一张图片就展示了这种相互作用。这个框架使我们能够即时构建复杂的虚拟现实图片。它就像不可思议的机器,但需要对工程问题有更深刻的理解。

事实上,这个软件不是软件,而是一种科学研究的哲学。现在我不知道它未来发展的细节。它的一些元素看起来很糟糕。以后我会改进它们,但目前我不知道最佳的改进方法。本文是一项调查。该软件的文档包含系统描述。该文档将得到改进和扩展。那么,让我们开始吧。

新增功能

现在我从事一份非常有趣的工作,没有太多时间深入描述这个框架。我也找不到助手。任何能抓住问题的人通常都有自己的出色工作。然而,这个框架正在 intensively 开发,我希望开发人员了解它的新更新。因此,我没有提供深入的描述,而是简要地说明了框架的变化。

1. 时间导数

新版本的公式编辑器包含一个新操作

Time derivation

让我们考虑一下这个操作的用法。例如,我们有以下图片

Time derivation

Init 组件具有以下属性编辑器

Property editor of Init

Init 有一个公式并接受 导数阶数 3。这意味着 Init 的任何客户端都可以使用高达 3 阶的公式导数。DerInit 的客户端。它的属性编辑器如下所示

Property editor of Der

我们有两个公式,一个输入变量,x。这个变量实际上是 Init公式1。该变量由 Init 提供。因此,我们可以计算那些需要 x 的导数阶数不超过 3 的公式的导数。

2. 新布局

以前版本的属性编辑器只能在单独的窗口中打开。现在您可以在桌面上找到它们。

New layout

现在相机视图直接放置在桌面上。右键单击标题(例如 )会在单独的窗口中显示旧布局

New layout

此外,新版软件包含由Weifen Luo开发的停靠控件。

3. 其他功能简述

目前版本的框架包含许多新组件:磁场、3D场测量、惯性导航系统等。现在有一个专门用于该框架的网站。我和我的同事更多是工程师和科学家,而不是软件开发人员或架构师。我们的许多工作与Code Project不符。如果您想了解这方面的工作,可以访问框架网站。本文包含一个专门介绍视频导航的新章节。

背景

这个框架看起来非常不寻常。其他类似的框架适用于特定领域的专家。例如,LabView面向数据流。典型的数据流图如下所示

Standard data flow representation

此图表示信号从 过滤器 1 流向 过滤器 2,然后流向 过滤器 3。情况非常清楚。然而,如果软件功能不限于数据流,那么更合适的语言是关联语言。在这种语言中,以及在我的软件中,此图看起来像

Associations of data flow

箭头的方向颠倒了。这幅图的意思是 过滤器 2过滤器 1 信号的消费者。过滤器 1 不知道 过滤器 2,但 过滤器 2 知道 过滤器 1。这是任何IT专家都知道的,尽管我希望本文能被更广泛的受众阅读,而不仅仅是IT专家。我们还可以想象以下图片中呈现的情况

Complicated associations

R 1 链接表示 飞机 1雷达 辐射的消费者。链接 F 1 表示 雷达飞机 1 6D 位置的消费者。雷达 作为辐射源确实知道 飞机 1。反之,飞机 1 不知道 雷达 的 6D 位置。类似地,我们可以将 飞机 2 视为 飞机 1 辐射的消费者。关联的表示法可能被视为软件开发者的自私。然而,电路专家发现虚数单位的字母 i 是数学家的自私,因为这个字母用于瞬时电流。然而,虚数单位不仅仅被电路专家使用。它被空气动力学、量子化学、半导体、控制系统等领域的专家使用。否则,我的软件非常灵活,并且很容易反转箭头的方向。这个软件远非完美。我打算进行修改。但是,现在它只与一小群用户讨论。也许3D形状的运动会吸引更多人使用它。这种宣传应该继续下去。

1. 6D运动

这个软件最初是数据流的一个版本。然而,数据流的一个优秀应用是动画。实际上,空气和空间物体的运动方程是已知的,使用高级数据流可以充分改进任何致力于6D运动的软件。这个软件有一个抽象的3D图形层。已经开发了OpenGL实现。我发现当使用许多3D图形窗口时,DirectX会导致内存溢出。也许我以后会开发一个DirectX实现。本章使用以下成分(组件)

  • 有限公式 有限公式
  • 常微分方程组 ODE
  • 刚性参考系 刚性参考系
  • 移动参考系 移动参考系
  • 相机 相机
  • 3D形状 3D形状

有限公式用于车辆的运动轨迹。如果我们要使用车辆动力学的常微分方程,则应使用第二类部件。刚性参考系用于在其上安装摄像头,而移动参考系用于安装车辆。但是,我们可以将摄像头安装在移动参考系上。现在我将展示一些示例。

1.1 殷麦曼机动

对我来说,殷麦曼机动就像“Hello world”。以下场景比真实场景更令人印象深刻。真实的飞机和飞行员不允许如此大的加速度。为了创建这个场景,我选择了6D运动的解析公式。其中一个公式如下所示

Kinematics formula

有时人们告诉我,“只有你能为这种高级机动构建公式。因此你的框架不适用。”然而,我的实践中有许多用2-3个人替换200个成员的例子。这个框架的一个潜在的优秀应用是组织一场关于飞机机动公式的比赛。这场比赛不仅包括有限公式。它们可以包括微分方程。更复杂的比赛可能包括加速度限制、机器人飞行员和空战。这是一场真正的思想较量。现在让我们回到殷麦曼机动。这个场景在以下图片中呈现

Immelmann

这幅图的意思是:我们有一组存储在 运动 组件上的运动学公式。我们还有一个移动坐标系 飞机坐标系。这个坐标系有以下属性

Moved frame editor of properties

...即,坐标 X 对应于 运动公式_1,...,四元数方向的 Q3 分量对应于 运动公式_7飞机 已安装在 飞机坐标系 上。我们还有两个刚性坐标系:前向坐标系左侧坐标系。刚性参考系的属性编辑器如下所示

Rigid frame editor of properties

它包含变换矩阵和坐标。我们可以构建一个框架树,如下所示

Tree of frames

此图表示 6D 状态帧 1.1 是相对于 帧 1 考虑的,依此类推。使用此类图是此框架中应用关联的原因之一。

如果您想尝试这个示例

然后将主窗体上的 StepStep Count 文本字段分别设置为 1 和 150。打开 ForwLeft 摄像头(右键单击方块)。将打开的窗口移动到(几乎)完全共同可见,然后单击其中一个窗口上的 Start 按钮。您将看到不同位置的殷麦曼机动

Forward camera

Left camera

1.2 飞机编队

除了殷麦曼机动之外,我们还可以构建一组移动的3D物体。如果您想尝试4架飞机的示例

然后将主窗体上的 步长步数 文本字段分别设置为 1 和 70。

Group of planes

这种情况包含一组飞机和几个摄像头。设置摄像头以获得所需视图是一个很好的练习。两台摄像头已经安装在飞机上。我曾怀疑这些摄像头是否会显示正确的图像,但经过一番思考,我理解了它们的移动。事实上,这个框架是训练3D想象能力的绝佳工具。

1.3 飞机 + 跟随系统

第3部分中,我考虑了雷达天线的两通道跟踪系统。我说过可以在天线上安装一个虚拟摄像头。我已经实现了它。我扩展了第3部分的场景,添加了一架飞机和摄像头。如果您想尝试4架飞机的示例,那么

将主窗体上的“步长”和“步数”文本字段分别设置为0.1和80。下图显示了控制系统的残差。

Oscillation process

红色曲线是方位角残差,蓝色曲线是仰角残差。我们可以通过安装在天线上的 跟随摄像头 找到这种振荡过程。

2. 变形

本章使用附加组件

  • 3D形状变换器 3D形状变换器
  • 位图变换器 位图变换器

与任何变换器一样,3D 形状是数据的消费者。它通过以下规则变换形状表面

u = f(w);

...其中 u = (x, y, z)w = (x', y', z') 是 3D 向量。由于此框架实际上包含数据流,我们可以使用任何数据变换器来定义 f。但是,我们应该定义 x 是什么。此框架使用别名的概念。例如,有限公式组件有常量 xyza

Finite formulas

每个常量都可以是别名,并且可以用作3D形状变换的输入数据。否则,3D形状变换器属性的编辑器看起来像

3D Shape transformation

上图的含义如下。w=(x', y', z') 的分量对应于 F.xF.yF.z,或者 Fxyz。否则,u = (x, y, z) 的分量对应于 FFormula_1、...、Formula_3。因此,我们可以变形 3D 形状。同样,我们也可以变形 2D 位图。

2.1 平面变形

如果飞机有垂直加速度,那么它的机翼就会变形。下面的图片显示了夸张的变形

Normal state of plane
正常状态
Deformed state of plane
变形状态

如果您想尝试这个示例,那么

此示例看起来像

Deformation of plane

此图片包含一个原型 飞机 和变形结果 变形飞机F 包含变形公式。此外,我们还有两个摄像头和一个参考系,用于定义摄像头的 6D 位置。

2.2 环面

此示例更像是解析几何的一个例子。它表明该框架也可以用作培训软件。在此示例中,一个正方形

Square

...被变形为一个环面

Torus

如果您想尝试这个示例,那么

2.3 视图变形

当我们需要变形视图时,存在一个工程问题。例如,有时需要模拟透过弯曲矿物玻璃的视图或扭曲镜中的视图。位图的变换器用于解决此问题。与此框架的任何典型对象一样,相机实现了一组接口。其中一个就是“位图提供者”。

位图变换器 位图变换器 可以连接到任何“位图提供者”。位图变换器的属性编辑器如下所示

Transformation of torus view

在这张图中,环面的摄像机视图被用作原型。我们对位图的坐标进行了以下变换

Transformation law of view

如果您想尝试这个示例,您应该从 2.2 下载。

3. 6D动力学

3.1 引言

固体动力学由常微分方程组 (ODE) 描述。该软件包含一个 ODE 求解器。但是,我发现对于希望模拟 6D 动力学的用户来说,这个求解器非常复杂。

所以我开发了一个特殊的求解器,6D动力学,用于6D动力学。它不容易使用,但我稍后会开发一个更简单的组件。这个组件不操作ODE,但它使用力和扭矩。它的属性编辑器看起来像

6D dynamics editor of properties

力和扭矩通过绝对参考系和相对参考系的分量进行分解

Decomposition of forces and torques

实体与相对坐标系之间存在刚性连接。这种分解非常方便。例如,使用相对坐标系描述飞机发动机的牵引力非常方便。然而,绝对坐标系对于描述重力非常有用。描述实体 6D 动力学需要反馈。力和扭矩作用于实体。力和扭矩的值取决于实体的运动参数。反之,运动参数的导数取决于力和扭矩。这种反馈在下图中呈现

6D dynamics feedback

它已被用作别名的机制来实现这种反馈。有关别名的更深入描述可以在文档中找到。别名的使用可以将别名与运动参数链接起来。如下所示

6D dynamics feedback

3.2 示例:飞机动力学

让我们考虑一个飞机动力学的例子。飞机受到重力、反作用力和气动力。此外,气动扭矩也作用于飞机。重力和平移力非常简单,我们只考虑气动力和扭矩。它们由阻力系数升力系数描述。这些系数取决于迎角。在跨音速时,这些系数强烈依赖于马赫数。气动扭矩也可以由系数描述,这些系数可能取决于迎角马赫数。通常,这些系数通过实验获得并由表格定义。我创建了一个场景,其中力和力矩取决于迎角和马赫数。也许我会受到空气动力学专家的批评。但是,我已准备好进一步讨论该主题并改进此场景。此场景在下图中显示

6D dynamics scenario

此场景包含不同的计算并使用气动系数的二维表 二维表。例如,阻力系数由以下二维表定义

Drag coefficient table

此表描述了阻力系数迎角马赫数的依赖关系。

4. 容器

一些工程设备包含一组非刚性连接的组件。将这些设备合并到容器中会很方便。下面是容器的一个示例。传统布局的直升机具有以下组件

  • 机身;
  • 主旋翼;
  • 尾桨。

为了俯仰(向前和向后倾斜)或滚转(侧向倾斜),主旋翼叶片的攻角在旋转过程中会发生变化或周期性变化,从而在旋翼翼的不同点产生升力差(参见控制飞行)。因此,我们有非常复杂的叶片运动。这个框架使用以下运动场景

Full picture of helicopter

为了方便起见,我们将这些组件合并为一个(命名为 直升机),然后在其周围安装了摄像头

Container of helicopter

您可以通过这些摄像头观察直升机

Different views of helicopter

您会注意到直升机特有的叶片运动。

5. 物理场

虚拟现实不仅展示肉眼可见的事物。它还代表了无形的物理现象。热量分布、电磁波以及许多其他现象是不可见的。可视化的一些很好的例子可以在以下链接中找到:

还有成千上万的其他例子。由于这个框架是通用的,它应该能够处理各种物理场。场可以存在于1D、2D、3D或4D空间(时间)。现在,任意维度的欧几里得空间被实现为物理场的环境。我的软件尚未将伪黎曼流形作为物理场的环境。然而,我已经不喜欢伪黎曼流形,更喜欢非交换几何我在非交换几何方面的第一步可以在这里找到。我最大的愿望是使这个框架适应非交换几何

让我们回到欧几里得空间中的物理场。物理学有标量场、矢量场、张量场等类型。建模的一个重要方面是坐标系变换过程中场的变换定律。关于这个主题的良好综述可以在这篇文章中找到。

5.1 物理场的实现

任何字段都实现了以下接口

namespace PhysicalField
{
    ///<summary>
    /// Physical Field
    ///<summary>
    public interface IPhysicalField
    {
        ///<summary>
        /// Dimension of space
        ///<summary>
        int SpaceDimension
        { get; }
        ///<summary>
        /// Dimension of space
        ///<summary>
        int Count
        { get; }
        ///<summary> /// Type of n-th component
        ///<summary>
        ///<param name="n">Component number</param>
        ///
        ///<returns>Type of n-th component</returns>
        object GetType(int n);
        ///<summary>
        /// Type of transformation of n - th component
        ///<summary>
        ///<param name="n">Component number</param>
        ///
        ///<returns>Transformation type</returns>
        object GetTransformationType(int n);
        ///<summary>
        /// Calculates field
        ///<summary>
        ///<param name="position">Position</param>
        ///
        ///<returns>Array of components of field</returns>
        object[] this[double[] position]
        { get; }
    }
}

一个场可能包含一组不同类型的组件。类型可以是标量、向量或张量。每个组件都有自己的变换类型。方法 object[] this[double[] position] 计算欧几里得空间中某个位置的场值。使用组件集的原因如下:红外和无线电波段的电磁场可以被视为性质不同的场。我们可以分离不同的频带,因此场的D分离可能非常方便。该软件包含数据流和数据处理。它是实现场的极佳材料。此外,对于6D动力学,我们使用以下反馈架构

Feedback of physical field

字段属性编辑器的用户界面如下所示

Properties of field

这个编辑器有许多组件。坐标由别名定义。场参数通过数据处理定义。我们可以使用矩阵和向量公式来定义场。以下带有向量积的公式将在下面使用

Field formula

...并对应于偶极天线的电场强度。

5.2 场与表面交互

场与表面之间的相互作用如下图所示

Interaction between field and surface

表面被元素划分。表面的每个元素都具有材料和导出参数。材料参数可以是

  • 表征表面各向异性的向量(表面可以有一组这样的向量);
  • 法向量;
  • 表面电导(表面可以有一组针对不同频段的此类参数);
  • 传热系数。

派生参数可以是

  • 表面电流(表面可以有一组针对不同频段的电流);
  • 表面温度;

表面元素的派生参数取决于元素附近的场值和元素的材料参数。别名机制用于计算派生参数。表面属性的用户界面编辑器如下图所示

Surface propreties

此图片包含字段和材料参数的别名。此外,它还包含一个派生参数。该软件支持派生参数的可视化

Surface visualization

输出参数用作可视化的颜色。下面给出了场与表面相互作用的示例场景

Interaction between surface and field

此示例包含一个 ,它是偶极天线的电场强度。表面 包含一个材料参数。它是一个法向量。派生参数是表面电流。表面电流的模数被可视化。如果您按下表面属性编辑器上的 更新 按钮,那么您可以看到以下图片

Result of influence of physical field

...透过 相机

6. 星星

最初,我使用星表进行自己的天文学研究。后来,我发现星表与框架相结合,是解决工程问题的绝佳材料。许多工程设备都使用天文仪器。此外,星表还可以用于虚拟现实。让我们逐步考虑一组恒星的构建。

步骤 1. SQL 查询

为此使用查询组件 SQL查询图标。其属性编辑器如下所示

Properties of SQL Query

现在这个框架支持SQL Server驱动、Oracle驱动和ODBC驱动。

步骤 2. 变换

星表操作视差、星等和其他参数。我们应该将它们转换为几何坐标以及可见的颜色和大小。为此我们使用数据变换。

步骤 3. 创建一组可见图像

我们为此使用一个特殊的组件。其属性编辑器如下所示

Editor of properties of array of stars

这个用户界面很清晰。

步骤 4. 安装(移动)相机

我们可以将摄像机安装在(移动的)参考系上,并通过它们观察星星。最终的画面看起来像

Picture of stars

下面展示了一个星体可视化的示例

Sample of visulization of stars

它包含了步骤 1 - 4 的所有要素。对于图片的运动,输入 步长步数,然后按下开始按钮

Start

7. 视频导航

如果我们有3D物体的几组照片,我们可以获得它的6D位置。在这个例子中,这个问题通过以下方式解决。从照片和虚拟摄像头中,我们获得物体的轮廓,如下图所示

Picture before iteration

红色轮廓对应照片,蓝色轮廓对应虚拟3D物体。然后我们对物体进行虚拟6D运动,使其轮廓匹配。结果,我们得到一个匹配,看起来像

Picture after iteration

为了解决这个问题,我们将使用以下组件组合

Picture after iteration

8. WPF 3D图形

最近,开发了框架的WPF版本。在这里您可以下载新版本的代码和示例。

几乎所有这些示例都是OpenGL示例的镜像。然而,该框架仍在持续开发中。现在它与Simulink兼容。在此版本中,Simulink PID控制器在跟踪系统示例中被使用。您可以在我的文章宏伟项目3. 与Simulink的兼容性中找到更多相关信息。下图展示了“场与表面交互”示例的WPF版本。

Picture after iteration

兴趣点

伊利亚·穆罗梅茨是俄罗斯民族英雄,也是现在乌克兰境内的一位居民。他曾身患重病,甚至瘫痪,直到33岁。然后他变得非常强大,击败了装备精良、技能娴熟的鞑靼人、蒙古人、可萨人以及希特勒侵略者的军队。现在我处于类似的情况。在苏联的铁幕之后,信息和硬件的匮乏使我瘫痪。现在,我自己的强大计算机正在利用包含大量恒星的星表在太空中寻找暗物质。这些星表任何人都可以下载。许多科学论文和数据库都可以访问。最新的技术使每个人都可以在家进行伟大的科学发现。现在我们拥有令人惊叹的3D图形。我甚至因为我的3D图形被冠以“3D怪物”的称号。一个人的声音是无人之声。当然,一个人无法生产商业软件。但他可以为它产生优秀的创意。

8.1 纹理支持

当前版本的框架(2010年11月19日)支持纹理。您可以通过以下链接下载当前版本。

纹理可以通过以下方式使用。用户应创建一个包含 ModelVisual3D 对象的 XAML 文件。该对象引用 2D 图形文件。XAML 文件和 2D 图形文件应放在同一个目录中。用户可以下载此类目录的示例,如下所示

用户应使用以下组件

3D component

用户将此组件放置在桌面上并打开 XAML 文件。

下图展示了以上示例

Texture support sample

此示例包含一个带纹理的立方体和4个具有不同背景颜色的虚拟摄像机。这些摄像机正对着立方体。此示例可以动画化。

© . All rights reserved.