4 Answers

要精确地把图像对应到到曲面是很难的,一般采用线性化的方法,也就是首先把曲面细分使得每个小块都接近平面,然后算出每个顶点对应贴图的坐标,最后把细分成一个一个小三角形或者四边形的图像贴到对应的小块曲面上。这也就是OpenGL或者Direct3D把一幅世界地图贴到一个球体上变成一个地球仪时候用的算法。把三角形映射到三角形的时候只要用普通的线性变换就行了。

如果是要让曲面显示出来的图形就像一张纸扭曲了之后的效果那样(也就是曲面距离保持不变),可以用某种uv坐标系;如果是要让曲面显示出来看起来跟平面一样,可以这样建立贴图坐标:将曲面的3D模型在目标视点的Camera下面做透视变换,变换后的透视空间中的顶点坐标的x、y分量作为贴图坐标。这样贴图完成之后,这个视点下面看到的就刚好是一个平面的效果。

如果曲面是液晶屏之类的形成的话到这里差不多就行了,如果是某个投影仪产生的图像,还需要再做一步计算投影图像,这个可以这样完成:
在OpenGL之类的环境下将曲面的3D模型按照上面说的方法贴上贴图,然后构造一个投影仪位置的Camera。从这个Camera的位置渲染贴好图的3D模型,得到的结果就是投影仪应该投出的图像。要求更高的时候,因为投影仪投出的单位面积光通量是个固定值,距离远的时候投出的图像会变暗,可以预先根据视空间的z坐标来修正亮度,让不同距离的图像亮度一致。

整个过程在Direct3D下面用HLSL或者OpenGL下面用GLSL应该可以一遍完成,即使是投影视频应该也没有大的问题。唯一的问题可能就是投影亮度了吧……

曲面的视角太广的时候这个方法也会有问题,因为人的视野只有中间区域近似是平的,两头也是非线性的。再就是这个方法投出来的只有一个位置看修正是精确的,在这附近近似精确,远一点之后还是弯曲的,这个也是没办法的。

2011-02-06 02:15:10

我的解决思路是这样的:
1.我们必须建立笛卡尔坐标或者球坐标,我个人趋向于选择球坐标,然后以球心坐标基点。
2.当我们在这个球体或者球体外任何一点的时候,计算出当前投射物体所在的坐标点。(这个需要根据几何学确定算法)。
3.当我们确定想透视到球面的时候,必须有一个算法计算当前物体位置到投射位置的切面面积。其中这里涉及到投射柱面切面面积和弧形面积(根据具体情况进行取舍)。(需要高效算法)
4.编写物体随着方向或者位置变化产生的透视面的变化。(需要专门的优化算法)
5.如何显示问题很简单,比如我们通过不同大小的屏幕观看电影,自动随着显示面积而进行调整。

2011-02-06 03:10:27

按正常的画,不要显示(在视野外),然后找一个阴影算法(不要变黑白),投影上去就OK了

2011-02-06 05:05:46

想到一个小思路,可否在3D沙盒中建立一个平面图形,然后建立一个透明的穹顶,将摄影机固定在球心,这时候只要截取穹顶上的某一部分对应现实中的某快屏幕,就可以获取需要的影像了吧?

2011-02-06 06:24:51
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制