CN1809843A - Model 3D构建的应用程序接口 - Google Patents
Model 3D构建的应用程序接口 Download PDFInfo
- Publication number
- CN1809843A CN1809843A CN200480001353.8A CN200480001353A CN1809843A CN 1809843 A CN1809843 A CN 1809843A CN 200480001353 A CN200480001353 A CN 200480001353A CN 1809843 A CN1809843 A CN 1809843A
- Authority
- CN
- China
- Prior art keywords
- public
- objects
- group
- scenery
- model
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T17/00—Three dimensional [3D] modelling, e.g. data description of 3D objects
- G06T17/005—Tree description, e.g. octree, quadtree
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Computer Graphics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Geometry (AREA)
- Software Systems (AREA)
- Processing Or Creating Images (AREA)
- Image Generation (AREA)
- User Interface Of Digital Computer (AREA)
Abstract
一应用程序接口可被用以构建由Model3D对象定义的3D模型的三维(3D)景物。该接口具有一个或多个组对象以及一个或多个叶对象。这些组对象包含或收集其它组对象和/或叶对象。叶对象可以是绘制对象或照度对象。组对象可具有变换操作以变换收集于其组中的对象。绘制对象定义绘制3D景物的3D模型或在3D模型上绘制2D图像的指令。照度对象定义照亮3D景物中3D模型的光线的类型和方向。方法处理用应用程序接口的对象构建的计算机程序对象的树分层结构。该方法遍历对象的3D景物树分层结构的分支,以处理组对象和叶对象。该方法检测下一未处理对象是组对象还是叶对象。如果是叶对象,方法检测该叶对象是光线对象或绘制3D对象。如果叶对象是光线对象,设置3D景物的照度。如果检测到绘制3D对象,则绘制按照度照亮的3D模型。该方法还对由组对象收集的对象组执行组操作。
Description
技术领域
本发明一般涉及计算机图形学领域,尤其涉及用于三维景物图形学的应用程序接口。
背景技术
访问计算机上图形的传统模式正在达到极限,部分原因是存储器和总线速度没有跟上主处理器和/或图形处理器的发展。一般而言,在需要复杂的图形效果时当前使用位图准备帧的模型需要太多的数据处理而无法跟上硬件刷新率。结果,当用常规图形模型尝试复杂图形效果时,与及时地完成变化导致下一帧的感知视件效果相反,这些变化会添加在不同的帧上导致结果在视觉上不理想。
此外,当将三维(3D)图形引入二维(2D)合成系统以显示2D图像和3D景物的混合景物时该问题被恶化。在实现这种混合系统的问题之中是如何定义3D模型的程序对象。应如何组织程序对象呢?
作出本发明就是参照这些和其它考虑。
发明内容
以上和其它问题由应用于计算机程序对象的计算机数据结构解决,该数据结构用以构建一树分层结构以呈现3D模型的三维(3D)景物。该树分层结构中的根对象收集3D景物的对象。该树分层结构中的组对象在树分层结构中收集其它组对象和绘制对象,并定义在由组对象收集的绘制对象上可进行的组操作。该树分层结构中的光线对象(Light对象)定义要在呈现3D景物中的3D模型时使用的照度,以及定义绘制3D景物中的3D模型的操作的一个或多个绘制3D对象。
根据本发明其它方面,本发明涉及一种用于处理计算机程序对象的分层结构的方法,这些对象用于绘制由合成系统呈现的三维(3D)模型的二维(2D)视图。该方法遍历对象的3D景物树分层结构的分支以处理组对象和叶对象。该方法检测下一未处理对象是叶对象还是组对象。如果它是叶对象,该方法检测叶对象是光线对象还是绘制3D对象。如果叶对象是光线对象,设置3D景物的照度。如果检测到绘制3D对象,3D模型被绘制为根据照度照亮。该方法还在由组对象收集的对象组上执行组操作。
根据另外方面,本发明涉及用于创建由模型3D对象定义的3D模型的三维(3D)景物的应用程序接口。该接口具有一个或多个组对象以及一个或多个叶对象。组对象包含或收集其它组对象和/或叶对象。叶对象可以是绘制对象或照度对象。组对象可具有变换操作以变换在其组中收的对象。绘制对象定义绘制3D景物的3D模型的指令,或绘制3D模型上2D图像的指令。照度对象定义照亮3D景物中3D模型的光线的类型和方向。
本发明可被实现为计算机进程、计算系统、或者诸如计算机程序产品或计算机可读介质的制造品。计算机可读介质可以是计算机系统可读的并编码用于执行计算机进程的指令的计算机程序的计算机存储介质。计算机可读介质还可以是计算系统可读的并编码用于执行计算机进程的指令的计算机程序的载波上的传播信号。
参阅以下详细描述和附图,描绘本发明的这些和各种其它特征、以及优点将变得显然。
附图说明
图1根据本发明一实施例示出模型3D构建API中相关对象的数据结构。
图2示出其上可实现本发明诸实施例的适当计算系统环境的示例。
图3是一般示出可结合本发明的图形层架构的框图。
图4是视件(Visual)和相关联组件的景物图表示,这些组件用于诸如通过遍历景物图以提供图形命令和其它数据来处理景物图。
图5是经构建的有效视件、绘制视件、以及相关联绘制图元的景物表示。
图6示出用于将摩托车呈现为3D景物的示例性Model3D(模型3D)树分层结构。
图7示出用于处理如图6所示的3D景物树分层结构的操作流程。
图8示出包含在Model3D组对象中Transform3D(变换3D)对象的相关对象的数据结构。
图9示出Model3D API中光线对象的相关对象的数据结构。
具体实施方式
图1根据本发明一实施例示出用于实现Model3D API的计算机程序对象的架构。Model3D对象10是根或呈现对象。有4个可能Model3D对象,它们是与根对象相关的子对象。在此架构中有3个对象-Primitive3D(元3D)对象12、视件Model3D对象14、以及光线对象16-是叶对象。Model3D组对象是该树中叶对象或其它组对象的收集节点,且还包含Transform3D对象18。Transform3D对象具有与其相关联的包含对象的分层结构。
Primitive3D对象包含网格信息26和材质信息28,它们可引用或指向对象的分层结构以帮助由Primitive3D对象12绘制的3D模型的定义。视件Model3D对象14定义结合到3D景物的2D图像。光线对象16定义3D景物的照度,并具有用于定义各种光线条件的对象的分层结构。所有这些对象都在此后的Model3D API定义章节中定义。
图1的对象被用以构建Model3D景物树,即用于呈现3D景物的Model3D对象的树分层结构。该3D景物树从具有绘制环境25的视件3D对象22或视件2D对象中被输入到Model3D根对象10上。视件3D对象22及视件2D对象24的绘制环境25包含指向Model3D根对象10和照相机对象32的指针。视件3D对象的指针33指向Model3D根对象10。视件3D对象的指针34指向照相机对象32。包含在视件2D对象24的绘制环境25中的指针31指向Model3D根对象10。包含在视件2D对象24的绘制环境25中的指针35指向照相机对象32。
照相机对象32定义查看3D景物的照相机的视点或感光点的位置。照相机对象32具有照相机对象的分层结构,包括投影照相机对象39、透视照相机对象36、正交照相机对象37和Matrix3D(矩阵3D)照相机对象38。这些照相机对象的每一个都在此后的Model3D API定义章节中定义。
此后所述的图6是将图1的Model3D对象用作构成块而构建的3D景物树的一个示例。用于呈现图63D景物的操作流程在此后参照图7描述。用于实现本发明的示例性可操作硬件和软件环境将参照图2~5描述。
示例性操作环境
图2示出了本发明可在其中实现的适当的计算系统环境100的示例。该计算系统环境100仅是适当计算环境的一个示例,并非旨在提出对本发明使用或功能性范围作任何限制。计算环境100也不应被解释为对示例性操作环境100中所示的任一组件或其组合有任何依赖性或任何需求。
本发明也可在很多其它通用或专用计算系统环境或配置中使用。适于本发明使用的众所周知的计算系统、环境、和/或配置的示例包括,但不限于,个人计算机、服务器计算机、诸如个人数字助理(PDA)、写字板PC或膝上型PC的手持式或膝上型装置、多处理器系统、基于微处理器的系统、机顶盒、可编程消费品电器、网络PC、迷你计算机、大型机、包括任一种以上系统或设备的分布式计算环境等等。
本发明可以计算机可执行指令的一般上下文进行说明,诸如由计算机执行的程序模块。一般而言,程序模块包括执行具体任务或实现具体抽象数据结构的例程、程序、对象、组件、数据结构等等。本发明还可在任务由经通信网络连接的远程处理设备执行的分布式计算环境中实践。在分布式计算环境中,程序模块可置于包括存储器存储设备的本地和远程计算机存储介质中。
参照图2,实现本发明的示例性系统包括以计算机110形式的通用计算装置。计算机110的组件可包括,但不限于,处理单元120、系统存储器130以及把包括系统存储器在内的各种系统组件耦合到处理单元120的系统总线121。系统总线121可能是若干总线结构类型中的任何一种,包括存储器总线或存储器控制器、外围总线、以及使用多种总线架构的任一种的本地总线。作为示例,而非限制,这些架构包括工业标准架构(ISA)总线、微信道架构(MCA)总线、扩展ISA(EISA)总线、视频电子标准协会(VESA)局部总线和也称为Mezzanine总线的外围部件互连(PCD总线。
计算机110通常包括各种计算机可读介质。计算机可读介质可以是能被计算机110访问的任何可用介质,并包括易失性和非易失性介质、可移动和不可移动介质。作为示例,而非限制,计算机可读介质可包括计算机存储介质和通信介质。计算机存储介质包括以任何方法或技术实现、用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的易失性和非易失性介质、可移动和不可移动介质。计算机存储介质包括但不限于RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字化多功能光盘(DVD)或其它光学存储技术、磁卡、磁带、磁盘存储或其它磁性存储设备、或任何其它可用于存储所需信息并可由计算机110访问的介质。通信介质通常在诸如载波或其它传输机制的已调制数据信号中体现计算机可读指令、数据结构、程序模块、或其它数据,且包括任何信息输送介质。术语“已调制数据信号”意指用在信号中编码信息的方式设置或改变其一个或多个特征的信号。作为示例,而非限制,通信介质包括诸如有线网络或直线连接的有线介质,和诸如声学、射频、红外线和其它无线介质的无线介质。以上任何介质的组合也应包括在计算机可读介质的范围中。
系统存储器130包括诸如只读存储器(ROM)131和随机存取存储器(RAM)132的易失性和/或非易失性存储器形式的计算机可读介质。包含有助于计算机110如起动时在元件间传送信息的基本例程的基本输入/输出系统(BIOS)133通常存储在ROM 131中。RAM 132通常包含可被处理单元120立即访问和/或当时正被操作的数据和/或程序模块。作为示例,而非限制,图2示出了操作系统134、应用程序135、其它程序模块136、和程序数据137。
计算机110还可包括其它可移动/不可移动、易失性/非易失性计算机存储介质。作为示例,图2图示了读取和写入不可移动、非易失性磁性介质的硬盘驱动器141,读取和写入可移动、非易失性磁盘152的磁盘驱动器151,读取和写入可移动、非易失性光盘156,诸如CD-ROM或其它光学介质的光盘驱动器155。其它也用在示例性计算环境中的可移动/不可移动、易失性/非易失性计算机存储介质包括,但不限于,如磁带、闪存卡、数字化视频光盘、数字化录像带、固态RAM、固态ROM等等。硬盘驱动器141通常通过诸如接口140的不可移动存储器接口与系统总线121连接,而磁盘驱动器151和光盘驱动器155通常通过诸如接口150的可移动存储器接口与系统总线121连接。
如上所述并如图2所示的盘驱动器及其相关联的计算机存储介质为计算机110提供计算机可读指令、数据结构、程序模块、和其它数据的存储。在图2中,例如,硬盘驱动器141被示为存储操作系统144、应用程序145、其它程序模块146、和程序数据147。注意这些组件可以与操作系统134、应用程序135、其它程序模块136、和程序数据137相同或不同。在此给予操作系统144、应用程序145、其它程序模块146、和程序数据147的数字不同至少说明他们是不同的副本。用户可通过诸如书写板(电子数字化仪)164、麦克风163、键盘162、和通常称为鼠标、跟踪球或触摸板等定点装置161向计算机110输入命令和信息。其它输入装置(未示出)可包括游戏杆、游戏垫、卫星接收器、扫描仪等等。这些和其它输入设备常常通过与系统总线耦合的用户输入接口160与处理单元120相连,但也可通过诸如并行端口、游戏端口或通用串行总线(USB)的其它接口连接。监视器191或其它类型的显示设备也可通过诸如视频接口190的接口与系统总线121相连。监视器191还可集成触摸屏模板193等等,它可通过诸如触摸屏接口192的接口向计算机系统110输入诸如手写字的数字化输入。注意监视器和/或触摸屏面板可物理地与在其中结合计算装置110的外壳相耦合。除了监视器,计算机还可包括诸如扬声器195和打印机196的其它输出设备,它们通过输出外围接口194相连。
计算机110可以在使用与一台或多台远程计算机,诸如远程计算机180的逻辑连接的网络化环境中运行。远程计算机180可以是个人计算机、服务器、路由器、网络PC、对等装置或其它公共网络节点,而且通常包括上述与个人计算机110相关的许多或全部组件,尽管在图2中仅图示了存储器存储设备181。图2中所描绘的逻辑连接包括局域网(LAN)171和广域网(WAN)173,但也可包括其它网络。这样的网络化环境在办公室、企业范围计算机网络、企业内部互联网和因特网上是常见的。
当用于LAN网络化环境中时,计算机110通过网络接口或适配器170与局域网171连接。当用于WAN网络化环境中时,计算机110通常包括调制解调器172或其它用于在广域网173,诸如因特网中建立通信的装置。可以是内置式或外置式的调制解调器172与系统总线121通过用户输入接口160或其它适当机制连接。在网络化环境中,与计算机110相关的程序模块或其一部分可存储在远程存储器存储装置中。作为示例,而非限制,图2示出了驻留于存储器装置181中的远程应用程序185。应当理解,所示网络连接是示例性的,且其它用于在计算机间建立通信连接的技术也可以使用。
用于处理视件树分层结构的软件环境
图3示出了其中可处理视件树的一般分层架构200。如图3所示,根据本发明一方面,程序代码202(例如应用程序或操作系统组件等)可被开发成以一种或多种不同方法输出图形数据,包括通过成像204、通过向量图形元素206、和/或通过直接置于视件应用程序编程接口(API)层212的功能/方法调用。一般而言,成像204提供带有用于载入、编辑和存储例如位图的图像的机制的程序代码202。如下所述,这些图像可由该系统的其它部分使用,且还有一种使用图元绘制代码直接绘制到图像中的方法。向量图形元素206提供另一种与其余的对象模型相一致的绘制图形的方法(如下所述)。向量图形元素208可通过标记语言创建,其中元素/属性系统208和呈现器系统210进行解释以作对视件API层212的适当调用。
图形层架构200包括一高层合成和动画引擎214,它包括或以其它方式与缓存数据结构216相关联。该缓存数据结构216包含一景物图,它包括按分层结构排列的根据已定义对象模型管理的对象,如下所述。一般而言,视件API层212向缓存数据结构216提供带有接口的程序代码202(以及呈现器系统210),包括创建对象、打开和关闭对象以向它们提供数据等等。换言之,该高层合成和动画引擎214展现一统一介质API层212,通过它开发者可表达有关图形和介质的要显示图形信息的意图,并提供带有足够信息的下层平台,从而该平台可最优化程序代码对硬件的使用。例如,下层平台将负责缓存、资源协商和介质集成。
高层合成和动画引擎214将指令流和可能的其它数据(例如位图指针)传递给快速低层的合成和动画引擎218。在此使用时,术语“高层”和“低层”类似于在其它计算情形中所使用的,其中一般而言相对高层组件越低的软件组件越接近硬件。因而,例如,从高层合成和动画引擎214发送的图形信息可在低层合成和动画引擎218上接收,其中该信息被用以向包括硬件222的图形子系统发送图形数据。
高层合成和动画引擎214结合程序代码202建立一景物图以表示由程序代码202提供的图形景物。例如,要绘制的每个条目可用系统将其缓存于景物图数据结构216中的绘制指令加载。如下所述,有许多指定该数据结构216并绘制什么的各种方法。此外,高层合成和动画引擎214结合定时和动画系统220以提供便于陈述的(或其它)动画控制(例如动画间隔)及定时控制。注意该动画系统使得动画值被传递到系统中几乎任何地方,包括例如,在元素属性层208上、视件API层212内部、以及任一其它资源中。该定时系统被展现在元素和视件层上。
低层合成和动画引擎218管理景物的组成、动画及呈现,其后它被提供给图形字系统222。该低层引擎218组成多个应用程序景物的呈现,并使用呈现组件实现图形向屏幕的真正呈现。然而,注意有时发生在更高层次上的某些呈现是有必要和/或有益的。例如,当低层服务来自多个应用程序的请求,高层在每个应用程序基础上例示时,通过成像机制204在高层执行耗时或应用程序专用呈现,并将对位图的引用传递给低层是可能的。
图4和5分别示出了景物图300和400,包括称为视件的基本对象。一般而言,视件包括向用户显示可视化表面的对象,并在显示器上具有可视化显示。如图4中所示,顶层(或根)视件302被连接到视件管理器对象304,该对象还与其中输出程序代码的图像数据的视窗(HWnd)或类似单元有关系(例如通过句柄)。该视件管理器304管理顶层视件(以及该视件的任何子视件)在该视窗306上的绘制。为了进行绘制,视件管理器304将景物图处理(例如遍历或传输)为由调度器308安排,并向低层组件218(图3)提供其相应视窗306的图形指令和其它数据。景物图处理通常将由调度器308以比低层组件218和/或图形子系统222的刷新率相对慢一些的速率来安排。图4示出了在顶层(根)视件302下以分层结构安排的众多子视件310-315,其中某些被显示为分别通过带有相关联指令列表318、319的例如包含绘制元和其它视件的绘制环境316、317(示为表示其临时性质的虚线框)来填充。这些视件还可包含其它属性信息,如以下示例视件类所示:
public abstract class Visual:VisualComponent
{
public Transform Transform{get;set;}
public float Opacity{get;set;}
public BlendMode BlendMode{get;set;}
public Geometry Clip{get;set;}
public bool Show{get;set;}
public HitTestResult HitTest(Point point);
public bool IsDescendant(Visual visual);
public static Point TransformToDescendant(
Visual reference,
Visual descendant,
Point point);
public static Point TransformFromDescendant(
Visual reference,
Visual descendant,
Point point);
public Rect CalculateBounds();//Loose bounds
public Rect CalculateTightBounds();//
public bool HitTestable{get;set;}
public bool HitTestIgnoreChildren{get;set;}
public bool HitTestFinal{get;set;}
}可见,视件通过可由get方法设置和/或读取的变换、剪辑、不透明度、以及可能的其它属性来提供服务。另外,视件具有控制它如何参与击中测试的标记。显示(Show)属性被用以显示/隐藏视件,例如为假时视件不可见,否则视件可见。
由变换属性设置的变换定义了视件的子图的坐标系统。变换之前的坐标系统被称为变换前坐标系统,包含之后的被称为包含后坐标系统,即带有变换的视件等效于带有作为父节点的变换节点的视件。视件树和合成系统的更全面描述包括在以上引用的题为“Visual and Scene Graph Interface”的相关专利申请中。
Model3D API处理
图6示出了以用于呈现3D景物(在此为摩托车)的二维示图的Model3D API构建的示例性3D景物树分层结构。该树示出了Model3D API中各种结构化数据对象的使用。摩托车的树的抽象或根节点是对象602。该抽象对象具有4个子对象—光线对象604、车体组对象606、车轮组对象608以及装置视件Model3D对象610。
车体组对象具有组成摩托车车体的三个子对象;它们是车框图元对象612、引擎图元对象614、以及油箱图元对象616。这些图元对象的每一个将绘制为该对象指定的摩托车车体元素。车轮组对象608收集前轮组对象618和后轮组对象620。车轮图元对象624绘制车轮的3D模型。前轮组对象618具有3D变换619以由车轮图元对象624将要绘制的车轮变换成前轮。类似地,后轮组对象620具有3D变换621以由车轮图元对象624将要绘制的车轮变换成后轮。此外,还有包含在车轮组对象608中的3D变换622。变换对象622可例如变换将前图元对象618和后图元对象620的执行,以变换车轮用于动画效果。
Model3D对象的示例性树可由图7所示逻辑操作的操作流程进行处理。本发明诸实施例的逻辑操作被实现为:(1)运行在系统上的一系列计算机实现动作或程序模块和/或(2)计算系统中相互连接的机器逻辑电路或电路模块。该实现是取决于实现本发明的计算系统性能需求的选择。相应地,在此所述的组成本发明诸实施例的逻辑操作被分别称为操作、结构装置、动作或模块。本领域技术人员将理解,这些操作、结构装置、动作或模块可用软件、固件、专用数字逻辑、以及任意组合实现而不背离本发明的精神和范围,如所附权利要求书所述。
在图7中,操作流程从设置照相机观看操作702开始。照相机位置由视件3D对象22提供(图1)。遍历操作704沿该树的分支而下直到它抵达一对象。正常地,该树往下并从左到右地遍历。组测试操作706检测对象是组对象还是叶对象。如果是组对象,操作流程向分支以处理组对象操作708。操作708将处理包含在对象中的任一组操作。Transform3D操作是组操作的示例。更多对象测试操作710检测该树上是否还有对象,并如果还有至少另一对象则将把流返回到遍历操作704。
如果下一对象是叶对象,操作流程从组测试操作706通过分支到光线对象测试操作712。如果叶对象是光线对象,操作流程将通过分支“是”从光线对象测试操作712到设置照度操作714。操作714处理光线对象以设置3D景物的照度。然后该操作流程继续到更多叶对象测试操作716。如果叶对象不是光线对象,则操作流程继续到图元/视件模型对象测试操作718。如果叶对象是图元对象,操作流程经分支到绘制元操作720,并随后到更多的叶对象测试操作716。该绘制元操作720将绘制由图元对象指定的3D模型。如果叶对象是视件Model3D对象,则操作流程经分支到绘制视件模型操作722并随后到更多的叶对象测试操作716。绘制视件模型操作722将绘制由视件Model3D对象指定的视件模型。
如果组中还有叶对象,则更多的叶测试操作716使操作流程经分支到叶遍历操作724。遍历操作724沿该树到同一组对象下的下一子对象。光线对象测试操作712和图元/视件模型测试操作718检测下一对象是光线对象、图元对象、还是视件模型对象。经检测的叶对象如上所述重复处理。处理了所有作为同一组对象的子对象的叶对象之后,操作流程经分支“否”从测试操作716到更多对象测试操作710。如果有更多对象要处理,操作流程返回到遍历操作704。如果没有,则已处理完Model3D树,且操作流程经726返回到3D景物处理的调用者。
在图6的3D景物树的示例中,抵达的第一对象是光线对象。如在以下Model3DAPI定义章节中的定义,光线对象定义照亮3D景物的光线类型。当抵达第一叶节点-光线节点时,组对象测试操作706检测该对象是叶节点,且操作流程经分支到光线对象测试操作708。光线对象604由测试操作708检测,且设置照度操作714由光线对象执行以设置3D景物的照度。然后该流程通过更多的叶对象测试操作716和更多的对象测试操作710返回到遍历操作704。
遍历操作704沿图6中树而下到车体组对象606。组测试操作使该流程经分支到处理组操作708以执行组对象606中车体组的任意操作。然后该流程再次返回到遍历操作704,而遍历操作将沿分支而下从车体组对象606到车框图元对象602。在操作流程通过测试操作706、712和718分支后,车框图元对象602将如上所述由绘制图元操作720处理。当操作流程通过更多叶对象测试716护送,遍历到下一叶对象操作724与测试操作712和718时,将处理引擎图元对象614和油箱图元对象616。当处理了所有来自车体组对象节点606的叶节点时,遍历操作704将沿该树到车轮组对象608。
车轮组对象及其子对象的处理与车体组对象及其子对象的处理一样,除了车轮组对象608包含一Transform3D对象622。该Transform3D对象可被用以动画化摩托车图像的车轮。当处理车轮组对象608时,操作流程将在测试Transform3D对象622之后将经分支从组对象测试操作706到进程组操作708。进程组操作708将执行对象622的变换操作以旋转摩托车的车轮。
图6示例性3D景物树中要处理的最后对象是装置视件Model3D对象610。在处理完该树的车轮组分支后,遍历操作704将严该树到装置对象610。在图7的操作流程中,该流通过测试操作706继续到绘制视件模型操作722。绘制视件模型操作722绘制由对象610指定的视件模型。这由图7的操作完成对图6中3D景物树的处理。
Model3D API定义
以下API为Model3D对象定义。
图1中诸如对象22的Visual3D对象基本上仅是:
·包括光线的一3D集合(呈现指令/景物图/元文件)
·定义该景物的2D投影的照相机
·用于将投影映射到局部坐标空间中的长方形2D视点,以及
·象抗混淆切换、模糊切换等的其它外围参数
呈现到3D
类似于2D,呈现通过作get调用的DawingContext发生。例如在2D中,比如:
DrawingContext ctx=...;
ctx.DrawRectangle(...);
ctx.PushTransform(...);
ctx.DrawGeometry(...);
ctx.PushTransform(...);
ctx.DrawEllipse(...);
ctx.Pop();
ctx.Pop();
为了与2D的一致性,3D中的相似模型为:
DrawingContext3 ctx=...;
ctx.DrawMesh(mesh,material);
ctx.PushTransform(transform3);
ctx.DrawMesh(...);
ctx.PushTransform(...);
ctx.DrawMesh(...);
ctx.Pop();
ctx.Pop();
注意该呈现模型对保留模式3D视件(其中简单存储“指令”)和即时模式3D视件(其中呈现直接发生,且照相机需要在前面建立)都能较好地工作。实际上,在保留模式情形中,内部所发生的是3D建模分层结构正在建立并保留。或者,在即时模式情形中,没有这样的事情发生,而指令正被直接签发且正在维护有环境堆栈(例如用于变换)。
示例代码
这里是显示用3D视件API编程的风格。
该示例简单地创建一Visual3D、获取要呈现的绘制环境、呈现图元和光线、设置照相机、并将视件添加到控件的子视件中。
//Create a 3D visual
Visual3D visual3=new Visual3D();
//Render into it
using(Drawing3DContext ctx=visual3.Models.Renderopen())
{
//Render meshes and lights into the geometry
ctx.DrawMesn(mesn,material);
ctx.PushTransform(transform3);
ctx.DrawMesh(...);
ctx.PushTransform(secondTransform3);
ctx.AddLight(...);
ctx.DrawMesh(...);
ctx.Pop();
ctx.Pop();
}
//Establish ambient properties on the visual
visual3.Camera=new PerspectiveCamera(...);
//Add it to the compositing children of some control called myControl
visualCollection children =
VisualHelper.GetvisualChildren(myControl);//or something
children.Add(visual3);
建模API
以上示出了当绘制“指令”被签发给环境时的使用的“命令呈现”风格。这不是声明性使用,且在元素/标记章节,我们会看到该命令行方法并不适合于说明性标记。
因此,有建立并使用类似存在于带有画刷、笔、几何图形、路径等2D中的3D“资源”的声明性方法。
最终,使用户能够构建进入3D指令流的众多类型被引入,且被构建对象可不使用该环境而设置到Visual3D中。
例如,以上基于Drawing3D环境的示例代码可被写为:
//Create a 3D visual
Visual3D visual3=new Visual3D();
visual3.Models.Add(new MeshPrimitive3D(mesh,material));
Model3DGroup innerGroup1=new Model3DGroup();
innerGroup1.Transform=transform3;
innerGroup1.Children.Add(new MeshPrimitive3D(mesh,material));
Model3DGroup innerGroup2=new Model3DGroup();
innerGroup2.Transform=secondTransform3;
innerGroup2.Children.Add(new Light(...));
innerGroup2.Children.Add(new MeshPrimitive3D(...));
innerGroup1.Children.Add(innerGroup2);
visual3.Models.Add(innerGroup1);
//Everything else is the same as before...
//Establish ambient properties on the visual
visual3.Camera=new PerspectiveCamera(...);
//Add it to the compositing children of some control called myControl
VisualCollection children=
VisualHelper.GetVisualChildren(myControl);//or something
children.Add(visual3);
在此,我们正是在建立模型并将其赋到Visual3D中。PushTransform/Pop对由本身具有在其下面变换和模型的Model3D组的构建所替换。
再一次,提供该建模方法和命令性基于环境的方法的要点不是要混淆,而是提供一方案用于:
·元素层声明性标记
·视件枚举
·景象图效果
·视件内容的可更改性
建模类分层结构
图1示出建模类分层结构。该建模类树的根是Model3D,它表示可赋予Visual3D的三维模型。最终,灯光、网格、.X文件流(因此它可来自文件、资源、存储器等)、模型组、以及3D放置的2D视件都是模型。因而。我们有以下分层结构:
·Model3D
οModel3Dgroup-将一组Model3D处置为一个单元的容器
οPrimitive3D
◆MeshPrimitive3D(网格、材质、hitTestID)
◆ImportedPrimitive3D(流、hitTestID)(对.x文件)
ο光线
◆AmbientLight(外围光线)
◆SpecularLight(镜面光线)
·DirectionalLight(有向光线)
·PointLight(点光线)
οSpotLight(聚光光线)
οVisualModel3D-具有视件、Point3以及hitTestID
Model3D类本身支持以下操作:
·获得3D边界框
·获得并设置Model3D的变换
·获得并设置其它“节点”层属性,如明暗模式
·获得并设置hitTestObject
视件API规范
首先,注意尽管它未对每个类型显式列出,这些类型的每一种都具有以下方法(在此对Vector3D示出,但也可应用于每个其它类型):
public static bool operator==(Vector3D vector1,vector3D vector2)
public static bool Equals(Vector3D vector1,vector3D vector2)
pudlic static bool operator l=(vector3D vector1,vector3D vector2)
public override bool Equals(object o)
public override int GetHashCode()
public override string ToString()
还有,每种源自Changeable(可变化)(直接或间接)的类型对它将需要具有起始的“public new MyType Copy()”。
图元类型
这些图元类型仅为支持本章节中所述的其它类型而存在。
Point3D
Point3D是对2D点类型System.Windows.Point的直接模拟。
public struct System.windows.Media3D.Point3D
{
public Point3D();//initializes to 0,0,0
public Point3D(double x,double y,double z);
public double X{get;set;}
public double Y{get;set;}
public double Z{get;set;}
public void offset(double dx,double dy,double dz);
public static Point3D operator+(Point3D point,Vector3D vector);
public static Point3D operator-(Point3D point,Vector3D vector);
public static vector3D operator-(Point3D point1,Point3D point2);
public static Point3D operator*(Point3D point,Matrix3D matrix);
public static Point3D operator*(Point3D point,Transtorm3D transform);
public static explicit operator vector3D(Point3D point);
//Explicit promotion of a 3D point to a 4D point.W coord becomes 1.
public static explicit operator Point4D(Point3D point);
}
TypeConverter规范
coordinate:
double-number-representation
comma-wsp:
one comma with any amount of whitespace before or after
coordinate-triple:
(coordinate comma-wsp){2}coordinate
point3D:
coordinate-triple
Vector3D
Vector3D是对2D向量类型System.Windows.Vector的直接模拟。
public struct System.windows.Media3D.Vector3D
{
public Vector3D()://initializes to 0,0,0
public Vector3D(double x,double y,double z);
public double X{get;set;}
public double Y{get;set;}
public double Z {get;set;}
public double Length{get;}
public double LengthSquared{get;}
public void Normalize();//make the Vector3D unit length
public static Vector3D operator-(Vector3D vector);
public static Vector3D operator+(Vector3D vector1,Vector3D vector2);
public static Vector3D operator-(Vector3D vector1,Vector3D vector2);
public static Point3D operator+(Vector3D vector,Point3D point);
public static Point3D operator-(Vector3D vector,Point3D point);
public static Vector3D operator*(Vector3D vector,double scalar);
public static Vector3D operator*(double scalar,Vector3D vector);
public static Vector3D operator/(Vector3D vector,double scalar);
public static Vector3D operator*(Vector3D vector,Matrix3D matrix);
public static Vector3D operator*(Vector3D vector,Transform3D
transform);
//return the dot product:vector1.X*vector2.X+vector1.Y*vector2.Y
public static double DotProduct(Vector3D vector1,Vector3D vector2);
//return a vector perpendicular to the two input vectors by computing
//the cross product.
public static Vector3D CrossProduct(Vector3D vector1,Vector3D
vector2);
//Return the angle required to rotate v1 into v2,in degrees
//This will return a value between[0,180]degrees
//(Note that this is slightly different from the Vector member
//function of the same name.Sioned antgles do not extend to 3D.)
public static douple AngleBetween(vector3D vector1,vector3D vector2);
public static explicit operator Point3D(Vector3D vector);}
//Explicit promotion of a 3D vector to a 4D point.W coord becomes 0.
public static explicit operator Point4D(vector3D point);
TypeConverter规范
point3D:
coordinate-triple
Point4D
Point4D将一第四组件w加入3D点中,并被用于通过非仿射Matrix3D变换。这不是Vector4D,因为‘w’组件1变换为Point3D,而‘w’组件0变换为Vector3D。
public struct System.Windows.Media3D.Point4D
{
public Point4D();//initializes to 0,0,0,0
public Point4D(double x,double y,double z,double w);
public double X{get;set;}
public double Y{get;set;}
public double Z{get;set;}
public double W{get;set;}
public static Point4D operator-(Point4D point1,Point4D point2);
public static Point4D operator+(Point4D point1,Point4D point2);
public static Point4D operator*(double scalar,Point4D point);
public static Point4D operator*(Point4D point,double scalar);
public static Point4D operator*(Point4D point,Matrix3D matrix);
public static Point4D operator*(Point4D point,Transform3D transform);
}
TypeConverter规范
point4D:
coordinate-quad
四元体
四元体显然是表示三维旋转的3D实体。它们的能力来自能够在四元体之间内插(并因而动画化)以获取平滑可靠的内插。该特定内插机制被称为球形线性内插(或SLERP)。
四元体可从其组件(x,y,z,w)的直接规范构建,或者被构建为轴/角度表示。第一种表示可导致非标准化的四元体,对它而言某些操作没有意义(例如提取轴和角度)。
一旦构建了四元体就不能设置其组件了,因为这样做可能会有模糊性。(例如,在非标准化四元体上设置角度意味着什么?)
public struct System.windows.Media3D.Quaternion
{
public Quaternion();//initializes to 0,0,0,0
//Non-normalized quaternions are allowed
public Quaternion(double x,double y,double z,double w);
//allow construction through axis and angle
public Quaternion(Vector3D acisofRotation,double angleInDegrees);
//fundamental Quaterni on components
public double X{get;}
public double Y{get;}
public double Z{get;}
public double W{get;}
//axis/angle access.will raise an exception if the quaternion
//is not normalized.
public Vector3D Axis{get;}
public double Angle{get;}//in degrees,just like everything else
//Magnitude of 1?Only normalized quaternions can be used in
//RotateTransform3D′s.
public bool IsNormalized{get;}
public Quaternion Conjugate();//return conjugate of the quaternion
public Quaternion Inverse();//return the inverse of the quaternion
public Quaternion Normalize();//return a normalized quaternion
public static Quaternion operator+(Quaternion left,Quaternion right);
public static Quaternion operator-(Quaternion left,Quaternion right);
public static Quaternion operator*(Quaternion left,Quaternion right);
//smoothly interpolate between two quaternions
public static Quaternion slerp(Quaternion left,Quaternion riqht,
double t);
}
TypeConverter规范
quaternion:
coordinate-guad | //x,y,z,w
representation
″(″coordinate-triple″)″coordinate //axis,angle
representation
Matrix3D
Matrix3D是对System.Windows.Matrix的3D模拟。类似于Matrix(矩阵),大多数API不取Matrix3D,而取深入方式支持动画的Transform3D。
3D计算的矩阵被表示为4×4矩阵。MIL使用行向量语法。
当矩阵被乘以一点时,它将该点从新坐标系统变换到先前的坐标系统。
变换可被嵌套到任意层。在应用新变换的任何时候,都与将其左乘到当前变换矩阵上相同。
public struct System.windows.Media3D.Matrix3D
{
//Construction and setting
public Matrix();//defaults to identity
public Matrix(
double m11,double m12,double m13,double m14,
double m21,double m22,double m23,double m24,
double m31,double m32,double m33,double m34,
double offsetX,double offsetY,double offsetzZ,double
m44);
//Identity
public static Matrix3D Identity{get;}
public void SetIdentity();
public bool IsIdentity{get;}
//Math operations
public void Prepend(Matrix3D matrix);//″this″becomes:matrix*this
public void Append(Matrix3D matrix);//″this″becomes:this*matrix
//Rotations-Ouaternion versions.If you want axis/angle rotation,
//bulid the quaternion out or axls/angle.
public void Rotate(Quaternion quaternion);
public void RotatePrepend(Quaternion quaternion);
public void RotateAt(Quaternion quaternion.Point3D center):
public void RotateAtPrepend(Quaternion quaternion,Point3D center);
public void Scale(Vector3D scalingVector);
public void ScalePrepend(Vector3D scalindVector):
public void ScaleAt(Vector3D scalingVector,Point3D point);
public void ScaleAtPrepend(Vector3D scalingVector,Point3D point);
public void Skew(vector3D skewVector);//Appends a skew,in
degrees
public void SkewPrepend(Vector3D skewVector);
public void SkewAt(Vector3D skewVector,Point3D point);
public void SkewAtPrepend(Vector3D skewVector,Point3D point);
public void Translate(Vector3D offset);//Appends a translation
public void TranslatePrepend(Vector3D offset);//Prepends a
translation
public static Matrix3D operator*(Matrix3D matrix1,Matrix3D matrix2);
//Transformation services.Those that operate on Vector3D and Point3D
//raise an exception if IsAffine==false.
public Point3D Transform(Point3D point);
public void Transform(Point3D[]points);
public Point4D TransTorm(Point4D point);
public void Transform(Point4D[]points);
//Since this is a vector ignores the offset parts of the matrix
public Vector3D Transform(Vector3D vector);
public void Transform(Vector3D[]vectors);
//Characteristics of the matrix
public bool IsAffine{get:}//true if m{1,2,3}4==0,m44==1.
public double Determinant{get;}
public bool HasInverse{get;}
public Matrix3D Inverse{get;}//Throws InvalidoperationException
if !HasInverse
//Individual members
public double M11{get;set;}
public double M12{get;set;}
public double M13{get;set;}
public double M14{get;set;}
public double M21{get;set;}
public double M22{get;set;}
public double M23{get;set;}
public double M24{get;set;}
public double M31{get;set;}
public double M32{get;set;}
public double M33{get;set;}
public double M34{get;set;}
public double offsetX{get;set;}
public double offsetY{get;set;}
public double offsetZ{get;set;}
public double M44{get;set;}
};
TypeConverter规范
matrix3D:
(coordinate comma-wsp){15}coordinate|″Identity″
Transform3D类分层结构
类似于2D变换,Transform3D是带有表示特定类型3D变换的具体子类的呈现基类。
Transform3D的特定子类也可以是动画进入之处。
Transform3D的整体分层结构看起来如下并在图8中示出:
Transfom3D
----Transform3Dcollection
----AffineTransform3D
---------TranslateTransform3D
---------ScaleTransform3D
---------RotateTransform3D
----MatrixTransform3D
Transform3D
根Transform3D对象802具有某些有趣的用于构建特定类型变换的静态方法。注意它不展现Matrix3D表示,因为该变换会比较宽广。
public abstract class System.windows.Media.Media3D.Transform3D:Changeable {
internal Transform3D();
public new Transform3D copy();
//static helpers for creating common transforms
public static MatrixTransTorm3D CreateMatrixTransTorm(Matrix3D matrix);
public static TranslateTransform3D CreateTranslation(Vector3D
translation);
public static RotateTransform3D CreateRotation(Vector3D axis,double
angle);
public static RotateTransform3D createRotation(Vector3D axis,double
angle;
Point3D rotationCenter);
public static RotateTransform3D CreateRotation(Quaternion quaternion);
public static RotateTransform3D CreateRotation(Quaternion quaternion,
Point3D rotationCenter);
public static ScaleTransform3D CreateScale(Vector3D scaleVector);
public static ScaleTransform3D CreateScale(Vector3D scaleVector,
Point3D scaleCenter);
public static Transform3D Identity{get;}
//Instance members
public bool IsAffine{get;}
public Point3D Transform(Point3D point);
public Vector3D Transform(Vector3D vector);
public Point4D Transform(Point4D point);
public void Transform(Point3D[]points):
public void Transform(Vector3D[]vectors);
public void Transform(Point4D[]points);
}
注意如果该变换不是一仿射变换,取Point3D/Vector3D的]Transform()方法将出现例外。
Transform3DCollection
Transform3D集合对象804将完全模拟视件2D中的TransformCollection,其Add方法用以上Create方法的同样方式更改。
public sealed class System.windows.Media3D.Transform3DCollection:
Transform3D,IList
{
//follow the model of TransformCollection
}
AffineTransform3D
仿射Transform3D对象806仅是(从翻译、扭曲、旋转、缩放)导出所有具体的仿射3D变换的基类,并且它展现对Matrix3D的读取访问。
public abstract class System.windows.Media3D.AffineTransform3D:
Transform3D
{
internal AffineTransform3D();//non-extensible
public virtual Matrix3D value{get;}
}
翻译Transform3D对象808
public sealed class System.windows.Media3D.TranslateTransform3D:
AffineTransform3D
{
public TranslateTransform3D():
public TranslateTransform3D(Vector3D offset):
public TranslateTransform3D(Vector3D offset,
Vector3DAnimationCollection
offsetAnimations);
public new TranslateTransform3D copy();
[Animations(″offsetAnimations″)]
public vector3D offset{get;set;}
public vector3DAnimationCollection offsetAnimations{get;set;}
public override Matrix3D Value{get;}
}
缩放Transform3D对象812
public sealed class System.Windows.Media3D.ScaleTransform3D:
AffineTransform3D
{
public ScaleTransform3D();
public ScaleTransform3D(Vector3D scaleVector);
public ScaleTransform3D(Vector3D scaleVector,Point3D scaleCenter);
public ScaleTransform3D(Vector3D scaleVector
Vector3DAnimationCollection
scaleVectorAnimations,
Point3D scaleCenter,
Point3DAnimationCollection
scaleCenterAnimations);
public new ScaleTransform3D Copy();
[Animations(″ScaleVectorAnimations″)]
public Vector3D ScaleVector{get;set;}
public Vector3DAnimationCollection ScaleVectorAnimations{get;set;}
[Animations(″ScaleCenterAnimations″)]
public Point3D ScaleCenter{get;set;}
public Point3DAnimationCollection ScaleCenterAnimations{get;set;}
public override Matrix3D Value{get;}
}
RotateTransform3D
由于要四处旋转的轴(以及因而四元体的使用)的概念引入,旋转Transform3D对象812不仅仅是来自2D旋转的简单映射。
public sealed Class RotateTransform3D:AffineTransform3D
{
public RotateTransform3D();
public RotateTransform3D(Vector3D axis,double angle);
public RotateTransform3D(Vector3D axis.double angle,Point3D center);
//Quaternions supplied to RotateTransform3D methods must be
normalized,
//otherwise an exception will be raised
public RotateTransform3D(Quaternion quaternion);
public RotateTransform3D(Quaternion quaternion,Point3D center);
public RotateTransform3D(
Quaternion quaternion,
QuaternionAnimationCollection quaternionAnimations,
Point3D center,
Point3DAnimationCollection centerAnimations);
public new RotateTransform3D Copy();
//Angle/Axis are just a different view on the QuaternionRotation
parameter.If
//Angle/Axis changes,QuaternionRotation will change accordingly,and
vice-versa.
public double Angle{get;set;}
public Vector3D Axis{get;set;}
[Animations(″QuaternionRotationAnimations″)]
public Quaternion QuaternionRotation{get;set;}
public QuaternionAnimationCollection QuaternionRotationAnimations{
get;set;}
[Animations(″CenterAnimations″)]
public Point3D Center{get;set;}
public Point3DAnimationCollection CenterAnimations {get;set;}
public override Matrix3D Value{get;}
}
注意在此仅仅四元体属性是可动画化的。一般而言,轴/角度的动画并不会工作得很好。为了更好地动画四元体,我们可从四元体的基值中提取轴和角度。如果仅仅想要在固定轴上动画角度,指定它的简便方法是建立表示这些位置的两个四元体,并在它们之间动画。
MatrixTransform3D
矩阵Transform3D对象直接从Matrix3D中建立Transform3D。
public sealed class System.Windows.Media3D.MatrixTransform3D:Transform3D
{
public MatrixTransform3D();
public MatrixTransform3D(Matrix3D matrix};
public new MatrixTransform3D Copy();
public Matrix3D Value{get;set;}
}
Transform3D TypeConverter
当一Transform3D类型属性在标记中指定时,该属性系统使用变换类型变换器以将字符串表示变换成适当的变换导出对象。无法使用该语法来描述动画属性,但可使用复杂的属性语法用于动画描述。
语法
该语法模拟2D变换。<>表示可任选参数。
·matrix(m00 m01 m02 m03 m11...m33)
·translate(tx ty tz)
·scale(sx<sy><sz><cx><cy><cz>)
ο如果未指定<sy>或<sz>,假设为统一大小。
ο如果指定了<cx><cy><cz>,则它们以及<sy><sz>都需要指定。它们被用作缩放中心。如果未指定,则中心被假设为0,0,0。
·rotate(ax ay az angle<cx><cy><cz>)
οax ay az指定旋转轴
ο角度是通过该轴的角度
ο如果未指定cx cy cz,则假设为0,0,0。
·skew(angleX angleY angleZ<cx><cy><cz>)
ο如果未指定cx cy cz,则假设为0,0,0。
文法
transform-list:
wsp* transforms?wsp*
transforms:
transform
|transform comma-wsp+transforms
transform:
matrix
|translate
|scale
|rotate
|skewX
|skewY
matrix:
″matrix″wsp*″(″wsp*
number comma-wsp
number comma-wsp
...13 more times...
number wsp*″)″
translate:
″translate″wsp*″(″wsp* number(comma-wsp number comma-wsp number)?
wsp*″)″
scale:
″scale″wsp*″(″wsp* number(comma-wsp number comma-wsp number
(comma-wsp number comma-wsp number comma-wsp number)?
)?wsp*″)″
rotate:
″rotate″wsp*″(″wsp* number wsp* number wsp* number wsp* number
(comma-wsp number comma-wsp number comma-wsp number)?wsp*″)″
skew:
″rotate″wsp*″(″wsp* number wsp* number wsp* number
(comma-wsp number comma-wsp number comma-wsp number)?wsp*″)″
Visual3D
图1中Visual3D对象22从Visual2D中导出,且这样做时得到所有其属性,包括:
·不透明
·2D几何图形剪辑
·2D混合模式
·点击测试API
·2D边界查询
·视件树中参与
注意所有不透明、剪辑、混合模式以及边界都应用于3D景物的2D投影。
public class System.Windows.Media3D.Visual3D:Visual
{
public Visual3D();
public Visual3D(UIContext Context);
//Modeling-oriented semantics.Default value is an empty collection.
public Model3DCollection Models{get;set;}
//Ambient properties
//Camera-there's no default,it's an error not to provide one.
public Camera Camera{get;set;}
//ViewPort establishes where the projection maps to in 2D.Default is
0,0,1,1
[Animation(″ViewPortAnimations″)]
public Rect ViewPort{get;set;}
public RectAnimationCollection ViewPortAnimations{get;set;}
public Fog Fog{get;set;}
}
当由照相机/模型组合确定的投影映射到2D局部坐标空间时,建立视点框。
Drawing3DContext
Drawing3DContext非常类似于2D绘制环境,且通过RenderOpen/RenderAppend可从Visual3D的Model3Dcollection访问。它感觉像是即时模式的呈现环境,尽管它是内部的保留指令。
public class System.Windows.Media3D.Drawing3DContext:IDisposable
{
internal Drawing3DContext();//can't be publicly constructed
//Rendering
public void DrawMesh(Mesh3D mesh,Material material,object
hitTestToken);
//These are for drawing imported primitives like.x files
public void DrawImportedPrimitive(ImportedPrimitive3DSource
primtiveSource,
object hitTestToken);
public void DrawImportedPrimitive(ImportedPrimtive3DSource
primitiveSource,
Material overridingMaterial,
object hitTestToken);
public void DrawVisual(Visual visual,Point3D centerPosition,
object hitTestToken);
public void DrawModel(Model3D model);
public void AddLight(Light light);
//Stack manipulation
public void PushTransform(Transform3D transform);
public void Pop();
public void Close();//Also invoked by Dispose();
}
对于这些Drawing3Dcontext操作的语义上的特定细节,参看建模API章节,其中实际上Drawing3Dcontext只是为了方便。例如,DrawImportedPrimitive(ImportedPrimitive3Dsource primitiveSource、objectHitTestToken)仅创建了ImportedPrimitive3D,并将其添加到当前积累的Model3D中(而它通过环境中的Push/Pop方法操纵)。
DrawModel()是在“环境”世界和“建模”世界之间的另一交叉点,使Model3D能被画入环境中。
没有从Drawing3Dcontext中的显式“读回”。这是因为它仅具有支持它的Model3Dgroup,并可一直枚举该集合。
建模API
这是这些类的公共及受保护的API,没有显示继承成员。
Model3D
图1中的Model3D对象是从中建立任何对象的抽象模型对象。
public abstract class Model3D:Cnangeable
{
public Transform3D Transform{get;set;}//defaults to Identity
public ShadingMode ShadingMode{get;set;}
public object HitTestToken{get;set;}
public Rect3D Bounds3D{get;}//Bounds for this model
//singleton″empty″model.
public static Model3D EmptyModel3D{get;}
}
Model3DGroup
图1中的Model3DGroup对象18是构建一模型组合,并通过可任选地变换其它属性或及其应用到各模型中而视它们为一个单元的地方。
public sealed class Model3DGroup:Model3D
{
public Model3DGroup();
//Drawing3DContext semantics
public Drawing3DContext RenderOpen();
public Drawing3DContext RenderAppend();
//Model3DCollection is a standard IList of Model3Ds.
public Model3DCollection Children{get;set;}
}
注意Model3DGruop还具有返回一Drawing3DContext的RenderOpen/Append。该环境的使用更改了Model3DCollection本身。RenderOpen()和RenderAppend()之间的差异是RenderOpen()首先清空该集合。
还要注意在Model3DGruop上一次只能打开一个Drawing3DContext,且当它被打开时,应用程序可能不能直接访问(用于读取或写入)Model3Dgruop上的内容。
光线分层结构
光线对象是Model3D对象。它们包括外围、位置、有向、和光斑光线。它们正是在Direct3D光线集上建模的,但具有作为建模分级结构一部份的附加属性,且因此可作坐标空间变换。
在所有光线上都提供外围、弥散、以及镜面色彩。
光线分层结构看起来如下,并在图9示出:
Model3D
----Light(抽象)
-------AmbientLight(具体)
-------DirectionLight(具体)
-------PointLight(具体)
----------SpotLight(具体)
基光线对象902仅为具有如下的抽象类:
public abstract class Light:Model3D
{
internal Light();//only allow public construction-no 3rd party
lights
[Animation(″AmbientColorAnimations″)]
public Color AmbientColor{get;set;}
public ColorAnimationCollection AmbientColorAnimations{get;set;}
[Animation(″DiffuseColorAnimations″)]
public Color DiffuseColor{get;set;}
public ColorAnimationCollection DiffuseColorAnimations{get;set;}
[Animation(″SpecularColorAnimations″)]
public Color SpecularColor{get;set;}
public ColorAnimationCollection SpecularColorAnimations{get;set;}
}
AmbientLight
外围光线对象904光线除其形状外统一建模。
public sealed class AmbientLight:Light
{
public AmbientLight(Color ambientColor);
}
DirectionLight
来自有向光线对象906的有向光线在空间上没有位置,并将其光线沿由向量定义的一特定方向投影。
public sealed class DirectionalLight:Light
{
public DirectionalLight{Color diffusecolor,Vector3D direction);//
common usage
[Animation(″DirectionAnimations″)]
public Vector3D Direction{get;set;}
public Vector3DAnimationCollection DirectionAnimations{get;set;}
}
该方向无需标准化,但它还必须具有非零幅度。
PointLight
来自点光线对象908的定位光线具有空间位置并向所有方向投影其光线。光线的分散由衰减和范围属性控制。
[strong name inheritance demand so 3rd parti es can't derive...we can't seal,
since SpotLight derives from this...]
public class PointLight:Light
{
public PointLight(Color diffuseColor,Point3D position);//common
usage
[Animation(″PositionAnimations″)]
public Point3D Position{get;set;}
public Point3DAnimationCollection PositionAnimations{get;set;}
//Range of the light,beyond which it has no effect.This is
Specified
//in local coordinates.
[Animation(″RangeAnimations″)]
public double Range {get,set,}
public DoubleAnimationCollection RangeAnimations{get,set,}
//constant,linear,and guadratic attenuation factors defines how the
light
//attenuates between its position and the value ot Range.
[Animation(″ConstantAttenuationAnimations″)]
public double ConstantAttenuation{get;set;}
public DoubleAnimationCollection ConstantAttenuationAnimations{get;
set;}
[Animation(″LinearAttenuationAnimations″)]
public double LinearAttenuation.{get;set;}
public DoubleAnimationCollection LinearAttenuationAnimations{get;
set;}
[Animation(″QuadraticAttenuationAnimations″)]
public double QuadraticAttenuation{get;set;}
public DoubleAnimationCollection QuadraticAttenuationAnimations{get;
set;}
}
SpotLight
SpotLight从PointLight导出为具有位置、范围和衰减,但还添加了方向以及控制光线“锥形”的参数。为了控制该“锥形”,必须制定outerConeAngle(外部锥角)(其外没有东西被照亮)和innerConeAngle(内部锥角)(其内所有东西被照亮)。内部锥形外部和外部锥形之间的光照线性衰减。(此处造成混淆的一个源是有两个分散-一个是内部锥形和外部锥形边界之间的“角度”分散;另一个则是距离上相对于光线位置的距离上的分散并受衰减和范围影响。)
public sealed class SpotLight:PointLight
{
public SpotLight(Color color,
Point3D position,
Vector3D direction,
double outerConeAngle,
double innerConeAngle);
[Animation(″DirectionAnimations″)]
public Vector3D Direction{get;set;}
public Vector3DAnimationCollection DirectionAnimations{get;set;}
[Animation(″OuterConeAngleAnimations″)]
public double OuterConeAngle{get;set;}
puolic DoubleAnimationCollection outerConeAngleAnimations{get;set;}
[Animation(″InnerConeAngleAnimations″)]
public double InnerConeAngle{get;set;}
public DoubleAnimationCollection InnerConeAngleAnimations{get;set;}
}
注意角度以度指定。
Primitive3D
图1中Primitive3D对象12是导致在树上呈现的页节点。具体的类带入显式制定的网格、以及被引入的图元(.x文件)。
public abstract class Primitive3D:Model3D
{
internal Primitive3D(object hitTestToken);
}
MeshPrimitive3D
MeshPrimitive3D用于以网格和材质建模。
public sealed class MeshPrimitive3D:Primitive3D
{
public MeshPrimitive3D(Mesh3D mesh,Material material,obiect
hitTestToken);
public Mesh3D Mesh{get;set;}
public Material Material{get;set;}
}
注意MeshPrimitive3D是叶几何图形,且它不包含自身而是包含网格。这意味着无需复制网格数据就可在带有不同材质、用于不同点击测试的多个MeshPrimitive3D上共享一网格。
ImportedPrimitive3D
ImportedPrimitive3D表示可变换成适当内部形式的所携带的外部获取图元(可能带有材质和动画)。它被Avalon示为刚性模型。其规范实例为.X文件,且具有显式引入.X文件的ImportedPrimitive3Dsource子类。
public sealed class ImportedPrimitive3D:Primitive3D
{
public ImportedPrimitive3D(ImportedPrimitive3DSource primitive,
object hitTestToKen);
public ImportedPrimitive3DSource PrimitiveSource{get;set;}
//Allow overriding the imported material(s)if there was any.If not
specified.
//this is null,and the built in material is used.
public Material OverridingMaterial{get;set;}
}
ImportedPrimitive3D的TypeConverter
由于.x文件被包括在景物中,用于表达它的简单TypeConverter格式看起来应为:
<ImportedPrimitive3D xfile=″myFile.x″/>
VisualModel3D
VisualModel3D取任意视件(按定义为2D)并将其置于景物中。在呈现时,它将是与屏幕对齐的,且其尺寸不受影响,但它将在照相机的特定Z平面上。该视件将保持交互。
public sealed class VisualModel3D:Model3D
{
public VisualModel3D(Visual visual,Point3 centerPoint,object
hitTestToKen);
public Visual Visual{get set;}
public Point3D CenterPoint{get;set;}
}
呈现VisualModel3D首先将CenterPoint变换到整体坐标中。然后以屏幕对齐方式将该视件呈现到像素缓存中,其中经变换CenterPoint的z在置入视件中心之处。在照相机运动中,VisualModel3D将一直占用同样数量的屏幕资产,并一直是正向面对且不受光线等影响。有关景物的其余部分在该视件的照相机运动期间的固定点将在该视件中央,因为放置基于该点进行。
所提供的视件是完全交互式的,并有效地从包括它的Visual3D继承(注意这意味着给定视件在任意VisualModel3D中仅可使用一次,就像视件仅可具有单个父亲一样)。
Mesh3D
Mesh3D图元是可通过编程构建的直接三角图元(允许索引和非索引指定)。注意它支持位置、法线、色彩和纹理信息,后三个是可任选的。该网格还允许选择是否要将其显示为三角形、直线或点。它还支持用于解释索引的三种拓朴:三角纹、三角条、以及三角扇。
对于不由Mesh3D直接支持的顶点格式和其它图元构建,可构建并引入.x文件。
public sealed class System.Windows.Media3D.Mesh3D:Changeable
{
public Mesh3D();
//Vertex data.Normals,Colors,and TextureCoordinates are all
optional.
public Point3DCollection Positions{get;set;}
public Vector3DCollection Normals{get;set;}//assumed to be
normalized
public Colorcollection Colors{get;set;}
public Colorcollection Specularcolors{get;set;}
public PointCollection TextureCoordinates{get;set;}
//Topology data.If null,treat as non-indexed primitive
public IntegerCollection TriangleIndices{get;set;}
//Primitive type-default=TriangleList
public MeshPrimitiveType MeshPrimitiveType{get;set;}
}
MeshPrimitiveType被定义为:
public enum System.Windows.Media3D.MeshPrimitiveType
{
TriangleList,
TriangleStrip,
TriangleFan,
LineList,
LineStrip,
PointList
}
网格数据的解释
Mesh3D中的每个顶点数据被分割到位置、法线、色彩以及纹理坐标中。仅位置坐标是必需的。如果提供了任一其它坐标,它们必需具有与位置集合完全一样的长度,否则将产生例外。
法线(如果提供)假设是标准化的。当需要法线时,则必须提供。
TriangleIndices集合具有索引到顶点数据的成员,以确定组成网格的三角形的每个顶点信息。该集合基于MeshPrimitiveType的设置来翻译。这些翻译与Direct3D中的完全一样。对于TriangeList,TriangleIndices集合中的每三个元素定义一新的三角形。对于TriangleFan,索引0,1,2确定第一三角形,然后是每个随后的索引i确定由顶点0,i,i-1给出的新三角形。对于TriangleStrip,索引0,1,2确定第一三角形,然后是每个随后的索引i确定由顶点i-2,i-1和i给出的新三角形。LineList、LineStrip以及PointList具有类似的翻译,而呈现则根据直线和点而不是三角形。
如果TriangleIndices是空,则网格被实现为非索引图元,它等于长度n的位置集合的持有值0,1,...,n-2,n-1的TriangleIndices。
网格的构建以及避免数据复制
在构建网格之后,实现创建了表示该网格的最优D3D结构。此时,真正的集合数据结构可通过网格实现丢弃以避免数据的复制。例如通过其它机制访问的网格的随后读回(例如遍历Visual3D模型分层结构)将可能从所持有的D3D信息重建数据,而不是保留原始数据。
网格的可变性
网格从Changeable(可变的)导出,并因而可更改。该实现将需要捕捉对顶点和索引数据的设置,并将这些变化传播到D3D数据结构中。
网格的TypeConverter
类似于所有其它类型,XAML复杂属性语法可被用以指定定义Mesh3D的集合。然而,提供了TypeConverter以使规范简洁。
定义在网格中的每个集合可取单个数字字符串以作解析并用来创建该集合。例如,仅具有位置和色彩的表示经索引三角形条纹的网格可被指定为:
<Mesh3D
meshPrimitiveType=″TriangleStrip″
positions=″1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18″
colors=″red blue green cyan magenta yellow″
triangleIndices=″1,3,4,1,2,3,4,5,6,1,2,4,2″
/>
当然,在复杂属性语法中这些的任一都可表示为更加繁复。
材质
构建Primitive3D的方法取定义其显现的材质。材质是带有三个具体子类的抽象基类:BrushMaterial、VisualMaterial、以及AdvancedMaterial。BrushMaterial和Visual Material两者都是称为BasicMaterial的另一抽象类的子类。因而:
Matrial
----BasicMaterial
--------BrushMaterial
--------VisualMaterial
----AdvancedMaterial
·BrushMaterial仅取单个画刷并可用于大范围的效果,包括获取透明度(每个像素的或分等级的)、具有纹理变换(甚至动画)、使用视频纹理、隐式的自动生成的mipmap等。具体地,对于以纯色、图像、梯度、甚至另一视件作为纹理,将只使用SolidColorBrush、ImageBrush、GradientBrush、或VisualBrush来创建其画刷材质。
·VisualMaterial被特别地设计成构建视件外的材质。该材质将在输入从其嵌入的3D世界中传递到视件的意义上是交互式的。可能会想知道它和带有VisualBrush的BrushMaterial之间的差异。该差异为BrushMaterial是非交互式的。
·尽管比仅使用BrushMaterial或VisualMaterial要复杂得多,但AdvancedMaterial类提供了更多的灵活性。然而,非3D爱因斯坦无需知道AdvancedMaterial,并可仅使用BrushMaterial/VisualMaterial来获取想获得的效果。
public abstract class Material:Changeable
{
internal Material();//don′t allow external subclassing
public new Material copy();//shadows changeable.Copy()
public static Material Empty {get;}//singleton material
}
public abstract class BasicMaterial:Material
{
internal BasicMaterial();//don’t allow external subclassing
public new BasicMaterial Copy();//shadows Changeable.copy()
Matrix TextureTransform{get;set;}//defaults to identity
}
材质获取极大的灵活性以及基于画刷的“经济概念”。具体地:
·无需反映独立的类似视频纹理、梯形纹理等的纹理分级结构,因为那些都可指定为画刷。
·画刷已封装α遮罩和分级不透明值,从而它们可用以纹饰。
·画刷是附着,在后来是库存诸如木纹阴影器的过程阴影器的合适地方。这在2D中将可用作填充或笔,在3D中则用作纹理。对于过程阴影器无需在3D空间中指定特定API支持。
注意,TextureTransform属性不同于可存在于BrushMaterial或VisualMaterial定义之内的任意变换。它指定来自讨论中的变换以纹饰坐标空间(其范围为[0,0][1,1])。材质中的变换与纹理变换组合以描述1×1(纹理坐标中)的材质如何在网格上映射。
阴影器
可在API中访问一组“库存”阴影器(其中许多被参数化)如下:
1)对于2D世界中有意义的阴影器,它们将被呈现为画刷的具体子类,其参数化法通过类上构建器表达,或表达为该类上的属性。然后它们可被应用于2D对象。
2).对于仅在3D世界中有意义的阴影器,它们将被呈现为Material或BasicMaterial的具体子类,其中它们也可通过其构建器参数化。
然后该展现将使阴影器能被应用于3D(如果适当则2D)网格。
BrushMaterial
如上所述,BrushMaterial仅封装一画刷。应用于Primitie3D的BrushMaterial被视为纹理。纹理将被直接映射—即,正在映射的元上2D u,v坐标将直接索引相应的纹理上由纹理变换更改的x,y坐标。注意,像Avalon中的所有2D,纹理坐标系统从左上角沿着正y方向向下。
用作画刷的VisualBrush将不接受输入,但它将根据其上的任何动画或所发生的任何结构变化进行更新。为了将视件用作材质并仍接收输入,使用如下所述的VisualMaterial是不合法的。
public sealed class BrushMaterial:BasicMaterial
{
public BrushMaterial(Brush brush);
public new BrushMaterial Copy();//shadows Material.Copy()
public Brush Brush{get;set;}
//Additional texturing specific knobs.
}
VisualMaterial
如上所述,VisualMaterial封装一交互式视件。这不同于在视件中使用的BrushMaterial,因为该视件以其纹饰形式保持活动。注意视件实际上以某种形式继承根Visual3D。在一种以上材质中使用单个UIElement,或在一个以上地方使用VisualMaterial。
public sealed class VisualMaterial:BasicMaterial
{
public VisualMaterial(Visual visual);
public new VisualMaterial copy ();//shadows changeable.Copy()
public Visual Visual {get;set;}
--(need to add viewport/viewbox stuff for positioning...)
//Additional texturing specific knobs.
}
AdvancedMaterial
BrushMaterials/VisualMaterials以及BumpMaps被用以定义AdvancedMaterial。
public class AdvancedMaterial:Material
{
public AdvancedMaterial();
//TODO:Add common constructors.
public new AdvancedMaterial Copy();//shadows Changeable.Copy()
public BasicMaterial DiffuseTexture{get;set;}
public BasicMaterial SpecularTexture{get;set;}
public BasicMaterial AmbientTexture{get;set;}
public BasicMaterial EmissiveTexture{get;set;}
[Animations(″SpecularPowerAnimations″);
public double SpecularPower{get;set;}
public DoubleAnimationcollection SpecularPowerAnimations{get;set;}
public BumpMap DiffuseBumpMap{get;set;}
public BumpMap ReflectionBumpMap{get;set;}
public BumpMap RefractionBumpMap{get;set;}
public BrushMaterial ReflectionEnvironmentMap{get;set;}
public BrushMaterial RefractionEnvironmentMap{get;set;}
}
注意EnvironmentMaps是期望以特定格式使能立方映射的纹理。具体地,立方映射的6个表面将需要以与纹理相关联的众所周知的画刷分段来表示(可能像画刷上3×2网格)。
外围、弥散、以及镜面属性取一BasicMaterial而非一般材质,因为它们本身不被指定为AdvancedMaterials。还要注意环境映射是BrushMaterials。
BumpMap定义
颠簸映射是通过图元上的纹理坐标映射到3D图元上的类似纹理的网格。然而,内插数据被解释为表面法线的扰动,导致图元的“颠簸式”显现。为了获得这个,颠簸映射带有诸如法线扰动的信息,以及可能其它信息。它们不带有色彩或透明度信息。正因为此,将画刷用作颠簸映射是不恰当的。
因此,我们引入新的BumpMap类,它将是特定像素格式的ImageSource。
public sealed class BumpMap:ImageSource
{
//Fill this in when we figure out issues below.
}
材质的TypeConverter
材质提供简单的TypeConverter,它使画刷的指定能自动提升为BrushMaterial的字符串指定。
Material:
...delegate to Brush type converter...
这允许指定类似于:
<MeshPrimitive3D...material=″yellow″/>
<MeshPrimitive3D...material=″LinearGradient blue green″/>
<MeshPrimitive3D...material=″HorizontalGradient orange purple″/>
<MeshPrimitive3D...material=″*Resource(myImageResource)″/>
“外围”参数
本节讨论的模型参数是那些不能在几何图形分层结构中任意层次中嵌入的“外围”参数。
模糊
通过设置Visual3D上的模糊属性,可将模糊添加到景物中。可用的模糊是“像素模糊”。模糊被表示为一抽象类以及如下所示的分层结构。
public abstract class Fog:Changeable
{
//only constructable internally
internal Fog(Color color);
public new Fog Copy();//hides Changeable.Copy()
[Animation(″ColorAnimations″)]
public Color Color {get;set;}
public ColorAnimationCollection ColorAnimations{get;set;}
//singleton representation of″no fog″
public static Fog Empty{get;}
}
public sealed class LinearFog:Fog
{
public LinearFog(Color color,double fogStart,double fogEnd);
[Animation(″FogStartAnimations″)]
public double FogStart{get;set;}
public DoubleAnimationCollection FogStartAnimations{get;set;}
[Animation(″FogEndAnimations″)]
public double FogEnd{get;set;}
public DoubleAnimationCollection FogEndAnimations{get;set;}
}
public sealed class ExponentialFog:Fog
{
public ExponentialFog(Coior color,double fogDensity,bool
squaredExponent);
[Animation(″FogDensityAnimations″)]
public double FogDensity{get;set;}
public DoubleAnimationCollection FogDensityAnimations{get;set;}
public bool SquaredExponent{get;set;}
}
fogDensty范围为0-1,且是模糊强度的标准化表示。
fogStart和fogEnd是在装置空间[0,1]中指定的z深度,并表示模糊开始和结束的地方。
照相机
图1中的照相机对象是将3D模型投影到2D视件之上的机制。照相机本省是抽象类型,有两个子类-ProjectionCamera(投影照相机)和MatrixCamera(矩阵照相机)。ProjectionCamera本身是带有两个子类的抽象类-PerspectiveCamera(透视照相机)和OrthogonalCamera(正交照相机)。PerspectiveCamera取众所周知的参数,诸如位置、视点以及视野以构建照相机。OrthogonalCamera类似于PerspectiveCamera,除了它取宽度而不是视野。MatrixCamera取用以定义世界到装置变换的Matrix3D。
public abstract class Camera:changeable
{
//Only allow to be built internally.
internal Camera();
public new Camera Copy();//hides Changeable.Copy()
}
在Visual3D中,照相机被用以提供Model3D上的视图,而结果投影被映射到在Visual3D中建立的2DViewPort(视口)。
还要注意,Visual3D的2D边界框将是3D模型的封装其顶点及与轴对齐外壳的剪辑成建立在视件上的片断的投影3D框。
ProjectionCamera
图1中ProjectionCamera对象39是从中导出PerspectiveCamera和OrthogonalCamera的抽象父对象。它封装MIL(介质集成层)所支持的两类ProjectionCamera的公共属性,诸如位置、查看方向以及上行方向。
public abstract class ProjectionCamera:Camera
{
//Common constructors
public ProjectionCamera();
//Camera data
[Animations(″NearPlaneDistanceAnimations″)]
public double NearPlaneDistance{get;set;}//default=0
public DoubleAnimationCollection NearPlaneDistanceAnimations{get;
set;}
[Animations(″FarPlaneDistanceAnimations″)]
public double FarPlaneDistance{get;set;}//default=infinity
public DoubleAnimationCollection FarPlaneDistanceAnimations{get;set;
}
[Animations(″PositionAnimations″)]
public Point3D Position{get;set;}
public Point3DAnimationCollection PositionAnimations{get;set;}
[Animations(″LookDirectionAnimations″)]
public Point3D LookDirection{get;set;}
public Point3DAnimationCollection LookDirectionAnimations{get;set;}
[Animations(″UpAnimations″)]
public Vector3D Up{get;set;}
public Vector3DAnimationCollection upAnimations{get;set;}
}
PerspectiveCamera
图1中的PerspectiveCamera对象36是通过它透视的投影照相机从诸如位置、视点以及视野等众所周知的参数中得以构建的装置。以下说明提供了PerspectiveCamera相关方面的良好指示。
图1查看和投影(视野应在水平方向)
public class PerspectiveCamera:ProjectionCamera
{
//Common constructors
public PerspectiveCamera();
public PerspectiveCamera(Point3D position,
Point3D lookDirection,
Vector3D Up,
double fieldofview);
public new ProjectionCamera Copy();//hides Changeable.Copy()
[Animations(″FieldofviewAnimations″)]
public double Fieldofview{get;set;}
public DoubleAnimationCollection FieldofViewAnimations{get;set;}
}
一些注解:
·PerspectiveCamera从ProjectionCamera继承位置、查看方向以及上行向量属性。
·FieldOfView表示水平视野,并用度数指定(像所有其它MIL角度)。
·较近和较远的PlaneDistances表示沿LookDirection点定义的向量离照相机位置的3D世界-坐标距离。较近PlaneDistance缺省为零,而较远PlaneDistance缺省为无限。
·在真正投影之后,如果近/远PlaneDistances仍分别为0/无限,则根据照相机投影来检查模型并投影其边界范围。然后检查结果边界范围使较近平面距离被设置成与与LookDirection垂直的离照相机位置最近的边界范围平面的距离。对于较远平面也是一样,但使用最远的平面。这导致z-缓存方案的优化使用,同时仍显示整个模型。
注意由PerspectiveCamera的参数定义的“投影平面”被映射到Visual3D上的视口长方形,并且这表示从3-空间到2-空间的变换。
OrthogonalCamera
图1中OrthogonalCamera对象37指定从世界到装置空间的正交投影。类似于PerspectiveCamera,OrthogonalCamera或正交照相机指定位置、查看方向和上行方向。然而,与PerspectiveCamera不同,OrthogonalCamera描述不包括透视缩短的投影。OrthogonalCamera从物理上描述其边平行的查看框(而PerspectiveCamera描述其边最终相交于照相机上一点的查看框)。
public class OrthoganalCamera:ProjectionCamera
{
//Common constructors
public OrthogonalCamera();
public OrthogonalCamera(Point3D position,
Point3D lookDirection,
Vector3D Up,
double width);
public new ProjectionCamera Copy();//hides Changeable.Copy()
[Animations(″WidthAnimations″)]
public double Width{get;set;}
public DoubleAnimationCollection WidthAnimations{get;set;}
}
一些注解:
·OrthogonalCamera从ProjectionCamera中继承位置、查看方向和上行向量属性。
·Width(宽度)表示OrthogonalCamera的查看框,并以世界单位指定。
·较近和较远PlaneDistances对PerspectiveCamera一样动作。
MatrixCamera
图1中MatrixCamera对象38是照相机的子类,并提供直接将矩阵指定为投影变换。这对具有自己的投影矩阵计算机制的应用程序是有用的。它当然表示对系统的先进使用。
public class MatrixCamera:Camera
{
//Common constructors
public MatrixCamera();
public MatrixCamera(Matrix3D ViewMatrix,Matrix3D ProjectionMatrix);
public new MatrixCamera Copy();//hides Changeable.Copy()
//Camera data
public Matrix3D ViewMatrix{get;set;}//default=identity
public Matrix3D ProjectionMatrix{get;set;}//default=identity
}
一些注解:
·ViewMatrix表示MatrixCamera的位置、查看方向和向上向量。由于横列方式,这可与Model3D分层结构的顶层变换不同。ProjectionMatrix将景物从照相机空间变换到装置空间。
·MinimumZ和MaximumZ属性已被移除,因为这些值由MatrixCamera的投影矩阵隐含。该投影矩阵坐标系统从照相机空间变换成标准化的立方体,其中X和Y的范围为[-1,1],z的范围为[0,1]。照相机空间中的最小和最大z坐标根据投影矩阵如何变换z坐标来定义。
注意结果投影被映射成Visual3D上的视口长方形,且这表示从3-空间到2-空间的变换。
XAML标记实例
以下是示出对XAML中整个Model3D分层结构的指定的更完全标记。注意某些语法可作一般变化。
简单的x-文件引入和合成
该实例仅创建一模型,带有两个被引入.x文件、其中之一上的旋转变换(z-轴上45°)以及坐落于0,1,0的单个白色点光线。
<Model3DGroup>
<!--Model children go as children here--/>
<PointLight position=″0,1,0″diffuseColor=″white″/>
<ImportedPrimitive3D xfile=″myFile.x″/>
<Model3DGroup transform=″rotate(0,0,1,45),scale(2)″>
<ImportedPrimitive3D xfile=″mySecondeFile.x″/>
</Model3DGroup>
</Model3DGroup>
现在,该标记将是文件、流、资源等等。客户机程序将调用对该XAML的调用,且这将由合适的应用程序构建要被使用的完整Model3Dgroup。
显式网格声明
该示例通过使用复杂属性XAML语法来提供经显式声明的MeshPrimitive3D。该网格将用从黄到红的线性梯度来纹饰。
这也是景物中的光线。
<Model3DGroup>
<!--Model children go as children here--/>
<PointLight position=″0,1,0″diffuseColor=″white″/>
<MeshPrimitive3D material=″LinearGradient yellow red″>
<MeshPrimitive3D.Mesh>
<Mesh3D
meshPrimitiveType-″TriangleStrip″
positions=″1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
16,17,18″
normals=″...sensible normal vectors...″
textureCoordinates=″.5,.5,1,1,0,0,.25,.25,.3,.4,.7,.8″
triangleIndices=″1,3,4,1,2,3,4,5,6,1,2,4,2″/>
</MeshPrimitive3D.Mesh>
</MeshPrimitive3D>
</Model3DGroup>
.x文件上的动画
该示例取第一.x文件并添加到XAML指定的动画中。该特定文件添加一统一的标度,在5秒内将.x文件从1x放大到2.5x,反转,然后无限重复。它还使用加速/减速来慢慢放大/慢慢缩小其标度。
<Model3DGroup>
<!--Model children go as children here--/>
<PointLight position=″0,1,0″diffuseColor=″white″/>
<ImportedPrimitive3D xfile=″myFile.x″>
<ImportedPrimitive3D.Transform>
<ScaleTransform3D>
<ScaleTransform3D.ScaleVector>
<VectorAnimation
from=″1,1,1″
to=″2.5,2.5,2.5″
begin=″immediately″
duration=″5″
autoReverse=″true″
repeatDuration=″indefinite″
acceleration=″0.1″
deceleration=″0.1″/>
</ScaleTransform3D.Scalevector>
<ScaleTransform3D>
</ImportedPrimitive3D.Transform>
</ImportedPrimitive3D>
</Model3DGroup>
VisualMaterial指定
该示例引入.x文件并将活动UI应用为其材质。
<Model3DGroup>
<!--Model children go as children here--/>
<PointLight position=″0,1,0″diffusecolor=″white″/>
<ImportedPrimitive3D xfile=″myFile.x″>
<ImportedPrimitive3D.overridingMaterial>
</VisualMaterial>
<Button Text=″Press Me″OnClick=″button_onclick″/>
</VisualMaterial>
</ImportedPrimitive3D.overridingMaterial>
</ImportedPrimitive3D>
</Model3DGroup>
Viewport3D的API
Viewport3D的API规范如下:
public class Viewport3D:UIElement//Control?FrameworkElement?
{
//Stock 2D properties
public BoxUnit Top{get;set;}
public BoxUnit Left{get;set;}
public BoxUnit Width{get;set;}
public BoxUnit Height{get;set;}
public Transform Transform{get;set;}
public Geometry Clip{get;set;}
//3D scene-level properties
public Fog Fog{get;set}
public Camera Camera{get;set;}//have good default
//The 3D Model itself
public Model3D Model{get;set;}
}
这完成了本发明实施例中的Model3DAPI定义。
尽管已用计算机结构特征、方法论动作的专用语言以及通过计算机可读介质描述了本发明,可以理解所附权利要求中定义的本发明无需受限于所述特定结构、动作或介质。因此,特定结构特征、动作和介质被揭示为实现本发明的示例性实施例。
上述各种实施例仅作为示例提供,且不应被解释为限制本发明。本领域技术人员容易理解可对本发明作各种变换和改变,而无需遵从在此所述的示例实施例和应用程序,且不背离在以下权利要求中陈述的本发明的真正精神和范围。
Claims (15)
1.一种应用于树分层结构中计算机程序对象的计算机数据结构,所述树分层结构用于呈现三维(3D)模型,其特征在于,所述数据结构包括:
用于呈现3D景物的一对象树分层结构;
所述树分层结构中收集所述3D景物的对象的一个根对象;
所述树分层结构中收集其它组对象或叶对象,并具有在所述组对象的被收集对象上操作的变换的一个或多个组对象;
所述树分层结构中的叶对象,所述叶对象包括在所述树分层结构中定义用以呈现3D景物中3D模型的照度的光线对象,以及定义绘制3D景物中3D模型的操作的一个或多个绘制3D对象。
2.如权利要求1所述的数据结构,其特征在于,还包括:
在将所述3D景物作为2D图像观看的3D空间中定义照相机视点位置的照相机数据。
3.如权利要求2所述的数据结构,其特征在于,还包括:
定义观看所述3D景物的2D图像的2D视窗边界的视口数据。
4.如权利要求1所述的数据结构,其特征在于,还包括:
在所述树分层结构中变换所述绘制对象的绘制操作以在所述3D景物中翻译3D模型的组对象。
5.如权利要求1所述的数据结构,其特征在于,绘制对象还包括:
执行所述绘制操作以在所述3D景物中创建2D图像的一个或多个视件模型对象。
6.一种用于处理计算机程序对象分层结构的方法,所述计算机程序对象用于绘制由合成系统呈现的三维(3D)模型的二维(2D)视图,其特征在于,所述方法包括:
遍历对象的3D景物树分层结构的分支以处理所述树的组对象和叶对象;
检测所述下一未处理对象是组对象还是叶对象;
如果检测到叶对象,检测所述叶对象是光线对象还是绘制3D对象;
如果所述叶对象是光线对象,设置绘制3D对象要使用的照度;以及
如果检测到所述绘制3D对象,绘制由所述光线对象提供的所述照度所照亮的3D模型。
7.如权利要求6所述的方法,其特征在于,还包括:
设置照相机视点;以及
基于所述照相机视点绘制所述3D模型的动作。
8.如权利要求6所述的方法,其特征在于,还包括:
将所述3D景物中的叶对象收集到一个叶对象组合中;以及
在叶对象的所述组执行一个组操作。
9.如权利要求8所述的方法,其特征在于,所述组操作是用于由所述组中的绘制对象变换所述绘制操作的一个或多个变换操作。
10.如权利要求6所述的方法,其特征在于,所述绘制对象包括:
绘制所述3D景物中3D模型的一图元3D绘制对象。
11.如权利要求6所述的方法,其特征在于,所述绘制对象包括:
在所述3D景物中绘制2D图像的一Model3D绘制对象。
12.在一计算系统中,用于创建由Model3D对象定义的3D模型的三维(3D)景物的应用程序接口,其特征在于,所述接口包括:
一个或多个绘制对象,定义绘制所述3D景物的3D模型的指令;以及
一光线对象,定义所述3D景物中3D模型的所述照度。
13.如权利要求12所述的应用程序接口,其特征在于,还包括:
一组对象,将一个或多个绘制对象收集到组中用于绘制一模型,所述模型是由该组中所述绘制对象绘制的所述模型的组合。
14.如权利要求13所述的应用程序接口,其特征在于,所述组对象包含在组中对所述绘制对象上作用的一个或多个组操作。
15.如权利要求14所述的应用程序接口,其特征在于,所述组操作包括:
一变换,在所述组中的一个或多个绘制对象的所述绘制操作进行操作。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US10/838,936 | 2004-05-03 | ||
US10/838,936 US20050243085A1 (en) | 2004-05-03 | 2004-05-03 | Model 3D construction application program interface |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1809843A true CN1809843A (zh) | 2006-07-26 |
Family
ID=35186597
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200480001353.8A Pending CN1809843A (zh) | 2004-05-03 | 2004-07-29 | Model 3D构建的应用程序接口 |
Country Status (14)
Country | Link |
---|---|
US (1) | US20050243085A1 (zh) |
EP (1) | EP1741065A2 (zh) |
JP (1) | JP2007536622A (zh) |
KR (1) | KR20070011062A (zh) |
CN (1) | CN1809843A (zh) |
AU (1) | AU2004279174A1 (zh) |
BR (1) | BRPI0406381A (zh) |
CA (1) | CA2507195A1 (zh) |
MX (1) | MXPA05006624A (zh) |
NO (1) | NO20052053L (zh) |
RU (1) | RU2005119661A (zh) |
TW (1) | TW200537395A (zh) |
WO (1) | WO2005111939A2 (zh) |
ZA (1) | ZA200503146B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101669146B (zh) * | 2007-04-24 | 2013-10-16 | 索尼电脑娱乐公司 | 使用摄像机和电视监视器的三维物体扫描 |
Families Citing this family (33)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE50308437D1 (de) * | 2003-02-03 | 2007-11-29 | Siemens Ag | Projektion von synthetischer information |
FR2851716A1 (fr) * | 2003-02-21 | 2004-08-27 | France Telecom | Procede pour la gestion de descriptions d'animations graphiques destinees a etre affichees, recepteur et systeme mettant en oeuvre ce procede. |
US8066384B2 (en) | 2004-08-18 | 2011-11-29 | Klip Collective, Inc. | Image projection kit and method and system of distributing image content for use with the same |
US7407297B2 (en) * | 2004-08-18 | 2008-08-05 | Klip Collective, Inc. | Image projection system and method |
US20070216711A1 (en) * | 2006-03-14 | 2007-09-20 | Microsoft Corporation Microsoft Patent Group | Abstracting transform representations in a graphics API |
US8300050B2 (en) | 2006-11-28 | 2012-10-30 | Adobe Systems Incorporated | Temporary low resolution rendering of 3D objects |
US8059124B2 (en) * | 2006-11-28 | 2011-11-15 | Adobe Systems Incorporated | Temporary non-tiled rendering of 3D objects |
US9519997B1 (en) * | 2007-03-09 | 2016-12-13 | Pixar | Perfect bounding for optimized evaluation of procedurally-generated scene data |
US7884823B2 (en) * | 2007-06-12 | 2011-02-08 | Microsoft Corporation | Three dimensional rendering of display information using viewer eye coordinates |
US20090033654A1 (en) * | 2007-07-31 | 2009-02-05 | Think/Thing | System and method for visually representing an object to a user |
KR101394338B1 (ko) * | 2007-10-31 | 2014-05-30 | 삼성전자주식회사 | 무선 센서 네트워크의 토폴로지 정보 표시 방법 및 장치 및이를 위한 시스템 |
US8345045B2 (en) * | 2008-03-04 | 2013-01-01 | Microsoft Corporation | Shader-based extensions for a declarative presentation framework |
US8760472B2 (en) * | 2008-04-01 | 2014-06-24 | Apple Inc. | Pixel transforms |
GB2462460C (en) | 2008-08-06 | 2015-07-29 | Statoilhydro Asa | Interactive rendering of physical entities |
KR20110026910A (ko) * | 2009-09-09 | 2011-03-16 | 현대중공업 주식회사 | 선박블록 운영관리장치 |
US10789761B2 (en) * | 2010-01-07 | 2020-09-29 | Suzhou Superengine Graphics Software Co., Ltd. | Method and device for processing spatial data |
US8913056B2 (en) * | 2010-08-04 | 2014-12-16 | Apple Inc. | Three dimensional user interface effects on a display by using properties of motion |
US9411413B2 (en) | 2010-08-04 | 2016-08-09 | Apple Inc. | Three dimensional user interface effects on a display |
TWI617178B (zh) * | 2012-09-20 | 2018-03-01 | 優克利丹有限公司 | 用以表現出三維景象之電腦圖形方法、系統及軟體產品 |
US9842425B2 (en) | 2012-09-21 | 2017-12-12 | Euclideon Pty Ltd. | System and method for rendering three-dimensional scenes by a computer graphics processor using orthogonal projection |
US20140115484A1 (en) * | 2012-10-19 | 2014-04-24 | Electronics And Telecommunications Research Institute | Apparatus and method for providing n-screen service using depth-based visual object groupings |
CN103793935B (zh) * | 2012-11-02 | 2017-04-05 | 同济大学 | 一种基于BRLO‑Tree混合树结构的城市立体动态场景生成方法 |
US10445946B2 (en) | 2013-10-29 | 2019-10-15 | Microsoft Technology Licensing, Llc | Dynamic workplane 3D rendering environment |
US9483862B2 (en) * | 2013-12-20 | 2016-11-01 | Qualcomm Incorporated | GPU-accelerated path rendering |
US10878136B2 (en) | 2016-09-14 | 2020-12-29 | Mixed Dimensions Inc. | 3D model validation and optimization system and method thereof |
US10713853B2 (en) | 2016-10-25 | 2020-07-14 | Microsoft Technology Licensing, Llc | Automatically grouping objects in three-dimensional graphical space |
WO2019055698A1 (en) * | 2017-09-13 | 2019-03-21 | Mixed Dimensions Inc. | 3D MODEL VALIDATION AND OPTIMIZATION SYSTEM AND METHOD THEREOF |
TWI662478B (zh) * | 2018-11-14 | 2019-06-11 | 江俊昇 | Civil engineering design method with real landscape |
CN111082961B (zh) * | 2019-05-28 | 2023-01-20 | 中兴通讯股份有限公司 | 域间的数据交互方法及装置 |
US20220390934A1 (en) * | 2020-06-30 | 2022-12-08 | Toshiba Mitsubishi-Electric Industrial Systems Corporation | Scada web hmi system |
CN115812211A (zh) * | 2021-06-10 | 2023-03-17 | 东芝三菱电机产业系统株式会社 | Scada网页hmi系统 |
WO2023281662A1 (ja) * | 2021-07-07 | 2023-01-12 | 東芝三菱電機産業システム株式会社 | Scadaウェブhmiシステム |
CN113791821B (zh) * | 2021-09-18 | 2023-11-17 | 广州博冠信息科技有限公司 | 基于虚幻引擎的动画处理方法、装置、介质与电子设备 |
Family Cites Families (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5561752A (en) * | 1994-12-22 | 1996-10-01 | Apple Computer, Inc. | Multipass graphics rendering method and apparatus with re-traverse flag |
US6215495B1 (en) * | 1997-05-30 | 2001-04-10 | Silicon Graphics, Inc. | Platform independent application program interface for interactive 3D scene management |
US6230116B1 (en) * | 1997-10-02 | 2001-05-08 | Clockwise Technologies Ltd. | Apparatus and method for interacting with a simulated 3D interface to an operating system operative to control computer resources |
US6243856B1 (en) * | 1998-02-03 | 2001-06-05 | Amazing Media, Inc. | System and method for encoding a scene graph |
AU7831500A (en) * | 1999-09-24 | 2001-04-24 | Sun Microsystems, Inc. | Method and apparatus for rapid processing of scene-based programs |
US6570564B1 (en) * | 1999-09-24 | 2003-05-27 | Sun Microsystems, Inc. | Method and apparatus for rapid processing of scene-based programs |
EP1134702A3 (en) * | 2000-03-14 | 2003-10-29 | Samsung Electronics Co., Ltd. | Method for processing nodes in 3D scene and apparatus thereof |
JP2001273520A (ja) * | 2000-03-23 | 2001-10-05 | Famotik Ltd | マルチメディアドキュメント統合表示システム |
US7444595B2 (en) * | 2003-08-13 | 2008-10-28 | National Instruments Corporation | Graphical programming system and method for creating and managing a scene graph |
US7511718B2 (en) * | 2003-10-23 | 2009-03-31 | Microsoft Corporation | Media integration layer |
-
2004
- 2004-05-03 US US10/838,936 patent/US20050243085A1/en not_active Abandoned
- 2004-07-23 TW TW093122095A patent/TW200537395A/zh unknown
- 2004-07-29 CN CN200480001353.8A patent/CN1809843A/zh active Pending
- 2004-07-29 MX MXPA05006624A patent/MXPA05006624A/es not_active Application Discontinuation
- 2004-07-29 KR KR1020057009541A patent/KR20070011062A/ko not_active Application Discontinuation
- 2004-07-29 JP JP2007511345A patent/JP2007536622A/ja active Pending
- 2004-07-29 CA CA002507195A patent/CA2507195A1/en not_active Abandoned
- 2004-07-29 AU AU2004279174A patent/AU2004279174A1/en not_active Abandoned
- 2004-07-29 RU RU2005119661/09A patent/RU2005119661A/ru not_active Application Discontinuation
- 2004-07-29 WO PCT/US2004/024369 patent/WO2005111939A2/en not_active Application Discontinuation
- 2004-07-29 EP EP04779432A patent/EP1741065A2/en not_active Withdrawn
- 2004-07-29 BR BR0406381-3A patent/BRPI0406381A/pt not_active IP Right Cessation
-
2005
- 2005-04-19 ZA ZA200503146A patent/ZA200503146B/en unknown
- 2005-04-26 NO NO20052053A patent/NO20052053L/no not_active Application Discontinuation
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101669146B (zh) * | 2007-04-24 | 2013-10-16 | 索尼电脑娱乐公司 | 使用摄像机和电视监视器的三维物体扫描 |
Also Published As
Publication number | Publication date |
---|---|
NO20052053D0 (no) | 2005-04-26 |
US20050243085A1 (en) | 2005-11-03 |
WO2005111939A2 (en) | 2005-11-24 |
ZA200503146B (en) | 2006-07-26 |
BRPI0406381A (pt) | 2006-02-07 |
RU2005119661A (ru) | 2006-04-27 |
KR20070011062A (ko) | 2007-01-24 |
JP2007536622A (ja) | 2007-12-13 |
CA2507195A1 (en) | 2005-11-03 |
MXPA05006624A (es) | 2006-01-24 |
TW200537395A (en) | 2005-11-16 |
NO20052053L (no) | 2005-06-22 |
WO2005111939A3 (en) | 2006-02-09 |
EP1741065A2 (en) | 2007-01-10 |
AU2004279174A1 (en) | 2005-11-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1809843A (zh) | Model 3D构建的应用程序接口 | |
CN1705976A (zh) | 向量图形的标记语言和对象模型 | |
CN1261912C (zh) | 基于深度图像表示三维物体的装置和方法 | |
CN1218282C (zh) | 用深度图像表示三维物体的节点结构 | |
CN1293518C (zh) | 具有割截与支援框线模式的三角形描绘方法与装置 | |
CN1534476A (zh) | 矢量图形的标记语言和对象模型 | |
CN1271568C (zh) | 信息变换系统 | |
CN1790421A (zh) | 基于深度图像表示三维物体的装置和方法 | |
CN1273931C (zh) | 改进图象质量的方法和系统 | |
CN1339764A (zh) | 用于图形系统的再循环浓淡树混合器 | |
CN1094624C (zh) | 图像数据处理设备和方法 | |
CN1795468A (zh) | 在基于扫描线的光栅图像处理器中跟踪深度的方法 | |
CN1131495C (zh) | 特征信息赋予方法及装置 | |
CN1264342C (zh) | 用于处理用参考信息模型配置的内容相关信息的电子节目指南 | |
CN1656465A (zh) | 可缩放的高性能3d图形显示 | |
CN1073540A (zh) | 管理类方法名 | |
CN1682528A (zh) | 图像合成装置、方法、程序和记录该程序的记录介质 | |
CN1073276A (zh) | 语言的中性对象 | |
CN1609792A (zh) | 计算机程序的编程接口 | |
CN1649384A (zh) | 图像处理设备、图像处理程序、及存储介质 | |
CN1653489A (zh) | 将单个命令转换成空间图像信息的图形引擎及合并有该图形引擎的电子装置和存储器 | |
CN1787012A (zh) | 用于处理图像的方法、装置和计算机程序 | |
CN1818897A (zh) | 面向多媒体网络电子出版物制作的实现方法 | |
CN1609793A (zh) | 用于计算机平台的编程接口 | |
CN1795453A (zh) | 实时墨迹作图 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |