几何尺寸与公差论坛

 找回密码
 注册
查看: 4215|回复: 0

OpenGL 的建模建议

[复制链接]
发表于 2007-1-2 19:04:26 | 显示全部楼层 |阅读模式
OpenGL 的建模建议





尽量使用三角形。因为多边形在OpenGL内部会被转换成三角形然后再光栅化。

相同的模型绘制多次会比较有效率(glu的1.1版本里面多边形绘制函数的效率很高)
避免三角形的T形交叉,如果出现了T形交叉,那么共享的边一定要使用相同的向量
保证屏幕上的多边形的面都是顺着一个方向定义的(要么顺时针,要么逆时针)。使用OpenGL的面裁减函数效率很高。
格栅化(tessellation)是把复杂表面(比如球形)分解成简单图形(三角形、矩形)的过程 四边形分解的一般方法是:比较四边形两对边的法线的内积(点积,dot product),取内积最大(即夹角最小)的那一对进行分解。两个边的法线可以用两边的外积(叉积,cross product)求得。下面的图2 就说明了这种算法:
因为上面建议了三角形和相同的图形能提高效率,所以把一个球形tesselate 的最好办法就是用内接的八面体(Octahedral)或者内接的二十面体(icosahedral)递归性的切割每个面(变成四个三角形)。图3 就说明了这个方法:因为上面建议了三角形和相同的图形能提高效率,所以把一个球形tesselate 的最好办法就是用内接的八面体(Octahedral)或者内接的二十面体(icosahedral)递归性的切割每个面(变成四个三角形)。图3 就说明了这个方法:
/* Compute edge vectors */
x10 = x1 - x0;
y10 = y1 - y0;
z10 = z1 - z0;
x12 = x1 - x2;
y12 = y1 - y2;
z12 = z1 - z2;
/* Compute the cross product */
cpx = (z10 * y12) - (y10 * z12);
cpy = (x10 * z12) - (z10 * x12);
cpz = (y10 * x12) - (x10 * y12);
/* Normalize the result to get the unit-length facet normal */
r = sqrt(cpx * cpx + cpy * cpy + cpz * cpz);
nx = cpx / r;
ny = cpy / r;
nz = cpz / r;
对四边形表面法线的计算要用一点点技巧。四边形(Quadrilateral)通常不会那么刚好的在一个平面上,所以我们可以选取四边形两个对角线的外积作为面向量。
/* Compute vectors */
x20 = x2 - x0;
y20 = y2 - y0;
z20 = z2 - z0;
x13 = x1 - x3;
y13 = y1 - y3;
z13 = z1 - z3;
/* Compute the cross product */
cpx = (z20 * y13) - (y20 * z13);
cpy = (x20 * z13) - (z20 * x13);
cpz = (y20 * x13) - (x20 * y13);
对于更多的边的形状,确定表面法线就很困难了。一般采取相隔最远的几个向量来求叉积。
统一向量的方向。模型中所有多边形的旋转方向应该一致才是正确的,为了做到这一点,可以判断相邻多边形在公共边上的连接方向,如果相反,那么两个多边形的转向就是正确的。如下面的图6所示:

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-12-22 18:56 , Processed in 0.036188 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表