关于3DS MAX中顶点法向量不正确所引发的一系列问题的请教。。。谢谢,给大家拜个早年我如果在3DS MAX中建立一
关于3DS MAX中顶点法向量不正确所引发的一系列问题的请教。。。
谢谢,给大家拜个早年
我如果在3DS MAX中建立一个立方体,则好像顶点法向量都是像田里的麦子一样,直挺挺的向上的。这样不对呀!3DS MAX为什么会这样哪?为什么不自动根据模型调整法向量的方向啊。没办法,我只有自己想一下啦。我的想法是,
1、计算所有3角形的法向量
2、对每个顶点,根据共用3角形的法向量来计算顶点法向量。
那么问题就来了。。。
=================================================
1、D3D中,如何计算一个三角形的法向量?已知三个点D3DXVECTOR3 p1, p2, p3; //顺时针
我知道是先计算出二个向量,再叉乘。但D3D,OPENGL与教科书中的定则是不一样的,所以不知道顺序是什么样的?
D3DXVECTOR3 v1 = p2 - p1;
D3DXVECTOR3 v2 = p3 - p1;
D3DXVECTOR3 n0 = D3DXVEC3Cross(v1, v2);
不知道这样的顺序对吗?
2、已知一个顶点有N个共用三角形,法向量分别为n1, ..., nn。那如何计算这个顶点法向量?
是直接加法运算吗?还是其它的运算呀?v3_N = n1 + ... + nn
3、一个顶点是只有3个共用三角形吗?或是数目不确定,根据建模实际情况确定的?
4、如果快速计算出一个顶点有哪些三角形使用这个顶点啦?谢谢。3DS MAX导出数据格式为
顶点个数:int m_iVertNum;
顶点数组(无顺):vector<D3DXVECTOR3> m_lstVertices;
三角形个数:int m_iFacesNum;
索引数组(三为一组,三角形):vector<INT> m_lstFaces;
[解决办法]
[解决办法]LZ为什么说3ds max的法线确定方法是错的?
对于立方体来说,如果要表现出棱角,顶点的法线方向必须与所在面的法线方向一致
而如果是球体这样的光滑物体,可以使多个顶点共享法线方向
所以说,并不是3ds max采用了错误的方式处理法线,相反它提供了一些方法可以自由修改法线方向,而修改后的法线方向也可以不依赖平面表面的法线方向,单独记录
1、向量的叉乘可以用左手或者右手帮助记忆(对应的是你在API中使用了左手坐标系还是右手坐标系,opengl是右手系,d3d默认是左手系),竖起拇指,伸直食指,然后将中指伸到与这两根手指呈90度角。设拇指为向量1,食指为向量2,中指的方向就是叉乘后向量3的方向
2、法向量应该是一个单位向量,否则光照的结果就不正确。如果你已知的几个法向量都是单位向量的话,求他们的平均值就可以了。但特别要注意最后和为0的情况(正好一正一反两个法线求和时)
3、这是由建模决定的,虽然建模时应当极力避免许多多边形共享一个顶点,但程序上也有必要保证这种情况的正确性
4、最烂的办法就是挨个去比较,但是如果你能有效将顶点进行hash的话,使用stl map也可以快速对顶点定位。我的尝试结果是宁可选用一个看上去不利落的办法对顶点进行hash,也比穷举法来得要快。
在你实际着手计算法线之前,最好先弄明白法线为什么要单独保存。事实上你完全不需要手动重新计算法线方向,直接采用工具编辑过并导出的数据就可以了。不但没有额外的工作量,还给美术在模型外观上的发挥留下一定的余地。
[解决办法]法线是向量啊,当然是向量加法。全部加起来,Normalize一下就可以了。
[解决办法]也要看情况的,3DS MAX里面的法线是“面法线”,而D3D里面最常用的是“顶点法线”,所以需要转换。
你上面关于1的那个,是“根据顶点坐标计算面法线”的方法,应该是没问题的吧——其实我对那些转来转去的也很挠头……
根据面法线计算顶点法线的方法是,首先找到与指定顶点相关的所有面,把这些面的法线全部加起来,再归一化,得到的就是指定顶点的顶点法线了。
[解决办法][解决办法]存在一个NormalEditor,可以通过Mesh得到当前时间点的法线.不过,某些模型的法线通过这样的方式未必能得到.比如骨骼动画之类的.
实际情况是美术几乎不会去手工调整法线的,累,一修改下顶点位置,还得调整法线.因此,大多数情况下都是通过计算共顶点的面法线的平均值得到的顶点法线.计算方法有几种,有平均的,有加权共顶点的三角形夹角的,有加权共顶点的三角形面积的.不过,在我看来,差别不大,因为法线这个东西不是需要非常精确的东西,差不多明暗对了就好.因此,使用平均算法足够了.
在处理的时候,需要注意,虽然是共顶点的,但3dsmax里还有一个平滑组的概念,用于控制共顶点的三角形的顶点法线的.相关代码,在3dsmax的SDK帮助文档里有,抄过来就好.
[解决办法]存在一个NormalEditor这样的Modifier,可以修改法线.最后的法线结果,可以通过Mesh得到.
------解决方案--------------------
恩。RVertex
看Max文档吧。face normal没啥用的。一般没啥人会做flat shading的。
[解决办法]核心的问题是顶点公用的问题
你可以看看你的导出数据,一共几个顶点, 如果是8个还是24个
如果你希望的盒子是要棱角分明的,而不是在边角圆滑过度的,那应该是24个顶点而不是8个顶点
输出的数据是顶点列表,以及通过顶点索引队列组成的三角形列表,顶点的法向量放置在顶点列表当中
需要注意,你要各个面棱角分明的时候,任何一个顶点都有3个不同的法向量,应该把他们输出成为三个独立的顶点,而不是一个顶点
类似的问题: 6个面,设置不同的纹理图片的时候, 纹理坐标也是保存在顶点里面的情况,不拆分出24个顶点,你实现不了不同面不同纹理的事情
如何控制输出的数据,就要看你导出模型的插件,以及模型建立的方式了
需要注意, 3dmax当中box对象,在3dmax内部是用参数化的对象来控制,并没有变成8个或者24个顶点,他是根据实际的需要在渲染的时候,和材质结合在一起来解释的, 三角化之后就不一样了
理解了上面的问题,就不用去考虑哪些三角形共用了一个顶点了
而是要从建模控制的角度,让美工从原始上解决这个问题, 面法向量的作用对于建模人员来很重要,他们必须要关心的