- 1、本文档共78页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * * * * * * * * * * * * * * * * * 在观察(投影)变换中,可得到变换后的表面方程 * * * * * * * * * * * * * * * * 扫描线算法(续) 表面相互贯穿或循环遮挡时,需先通过切割来消除循环遮挡,再应用该算法 像空间 4.深度排序算法(画家算法)depth-sorting method 物空间 画家算法 将表面按各自深度的最深值排序 从深度最大的表面开始,逐个扫描转换 画家算法(续) 两个面S和S’,且 S深度 S’深度 但它们深度上有重叠 如果以下条件都不满足,则需重新排序 投影无重叠 投影的包围矩形无重迭 相对于观察位置,S完全位于S’之后 相对于观察位置, S’完全位于S之前 S的所有顶点都在S’的后面 S’的所有顶点都在S的前面 S,S’ S’,S 5. BSP树算法—画家算法的一种实现 分割场景对象的时候,相对于视点,判断各表面是位于分割平面的前还是后。不适用于动态场景 右左遍历BSP树,逐个扫描转换 物空间 6.区域细分算法 area-subdivision method 将投影平面不断细分为更小的矩形,直到满足终止条件,将该矩形内象素置入刷新缓存。 表面与投影平面的子矩形区域的关系 包围表面 重迭表面 内含表面 分离表面 对于一个子区域,分割终止条件有几种情况: 所有表面均为它的分离表面 只有一个重迭 or 内含 or 包围表面 有一遮挡了其它所有表面的包围表面(各表面进行深度排序) 像空间 + 物空间完成深度排序 区域细分的不同方法 7.八叉树算法 由前往后(0,1…7)将八叉树结点映射到观察表面 仅当刷新缓存中相应的象素为空时才置值 0 1 3 2 4 5 7 物空间 8.光线投射算法 ray casting 做由观察平面对应的视口上每一象素进入场景的射线(由视点、观察方向、投影方法决定),求之与所有对象的交点,离观察平面最近的交点置入刷新缓存,其所在面即为可见面。 对于曲面、球面场景效率高。 是深度缓存算法的变形。 象素 物空间 可见面判别方法小结 应用相关,结合使用,硬件实现,并行处理 --------------------------- 分布广,深度重叠少: 画家算法,BSP 深度重叠多,分布范围小:扫描线,区域细分 --------------------------- 几千个面以下:画家算法,BSP,扫描线 几千个面以上:深度缓存,八叉树 --------------------------- 深度缓存:较为通用 BSP:从不同观察参考点生成多个视图 八叉树,光线投射:含曲面的场景 曲面的可见性判断 光线投射或八叉树算法 曲面的层位线显示:一组表示曲面形状的曲线 曲面的层位线显示及其可见性判断 曲面的xy平面投影图:y = f(x,z) 选定z的范围,设定步长?z f(x0,z0) f(x0,z0+ ?z) x0 x y f(x1,z0) f(x1,z0+ ?z) x1 f(x0,z0+ 2?z) f(x1,z0+ 2?z) Ymax Ymin Ymax Ymin OpenGL显示三维模型 GLfloat ctrlPts[8][3] = { { 10.0, 100.0, 0.0}, { 10.0, 200.0, 0.0}, {110.0, 200.0, 0.0}, {110.0, 100.0, 0.0}, { 10.0, 100.0, 100.0}, { 10.0, 200.0, 100.0}, {110.0, 200.0, 100.0}, {110.0, 100.0, 100.0}}; void myinit(void) { glClearColor (0.0, 0.0, 0.0, 1.0); glEnable(GL_DEPTH_TEST); glFrontFace(GL_CCW); } void display() { glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT); glPushMatrix (); glEnable(GL_CULL_FACE); glCullFace(GL_FRONT/GL_BACK); glRotatef(15, 0.0f, 1.0f, 0.0f); glRotatef(15, 1.0f, 0.0f, 0.0f); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL/GL_LINE); glColor3f(1.0, 0.0, 0.0); glBegin(GL_POLYGON);
文档评论(0)