查看: 1331|回复: 20

关于对primitiveset操作的问题

[复制链接]

该用户从未签到

发表于 2015-6-12 10:27:32 | 显示全部楼层 |阅读模式
我现在想得到每一个绘制图元(三角形或四边形),然后对其进行几何变换(主要是旋转),然后得到变换后的坐标。该怎么做呢?请大神指导下

该用户从未签到

 楼主| 发表于 2015-6-12 10:28:29 | 显示全部楼层
这是我添加面片的成员函数
void MyGeometry::addFaces()
{
        int index1, index2, index3, index4;
        for (unsigned i = 0; i < _m - 1; i++)
        {
                for (unsigned j = 0; j < _n; j++)
                {
                        if (i == 0)
                        {
                                //极点一周三角面片
                                osg::ref_ptr<osg:rawElementsUInt>pTri_pole = new osg::DrawElementsUInt(osg:rimitiveSet::TRIANGLES, 0);
                                index1 = 0;
                                index2 = 1 + j;
                                index3 = (j + 1) % _n + 1;
                                pTri_pole->push_back(index1);
                                pTri_pole->push_back(index2);
                                pTri_pole->push_back(index3);
                                addPrimitiveSet(pTri_pole.get());
                        }
                        else if (i == _m - 2)
                        {
                                //底部三角形面片
                                osg::ref_ptr<osg::DrawElementsUInt>pTri_bottom = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
                                index1 = (_m - 3)*_n + 1 + j;
                                index2 = (_m - 2)*_n + 1;
                                index3 = (_m - 3)*_n + (j + 1) % _n + 1;
                                pTri_bottom->push_back(index1);
                                pTri_bottom->push_back(index2);
                                pTri_bottom->push_back(index3);
                                addPrimitiveSet(pTri_bottom.get());
                        }
                        else
                        {
                                //中部四边形面片
                                osg::ref_ptr<osg::DrawElementsUInt>pQua_middle = new osg::DrawElementsUInt(osg::PrimitiveSet:UADS, 0);
                                index1 = 1 + j + _n*(i - 1);
                                index2 = (_n + 1) + j + _n*(i - 1);
                                index3 = _n + (j + 1) % _n + 1 + _n*(i - 1);
                                index4 = (j + 1) % _n + 1 + _n*(i - 1);
                                pQua_middle->push_back(index1);
                                pQua_middle->push_back(index2);
                                pQua_middle->push_back(index3);
                                pQua_middle->push_back(index4);
                                addPrimitiveSet(pQua_middle.get());
                        }
                }
        }
        osgUtil::SmoothingVisitor smv;
        smv.smooth(*this);
}

该用户从未签到

发表于 2015-6-12 13:02:37 | 显示全部楼层
您打算只旋转geode中的某一个图元,而其他的不旋转?不可能。一个geode里面一只有个图元可以实现您的要求。
至于如何得到坐标,要看你要得到什么空间的坐标(世界、眼睛、投影、视口?),方法全是vertex*M(M是localTo某个空间的变换矩阵)

该用户从未签到

 楼主| 发表于 2015-6-12 15:08:35 | 显示全部楼层
buaahc 发表于 2015-6-12 13:02
您打算只旋转geode中的某一个图元,而其他的不旋转?不可能。一个geode里面一只有个图元可以实现您的要求。 ...

从效果上讲,我不是要旋转面片,只是要得到旋转到指定平面后的坐标值。不是只对一个做操作,是对所有图元做相同的处理。对于坐标,我想在物体坐标系就ok,应该不用进行坐标系间的转换。不知道我这样说,说清楚了吗?

该用户从未签到

发表于 2015-6-12 15:28:47 | 显示全部楼层
物体坐标系?glVertex也就是图元的顶点坐标本身就是物体坐标系,。。。不论你如何的旋转移动缩放(矩阵操作),物体坐标都不变,除非你在更新回调(VBO)和shader中动态进行进行改变顶点坐标

该用户从未签到

 楼主| 发表于 2015-6-12 15:42:16 | 显示全部楼层
嗯,这个我知道,我的意识我这样做不是为了改变顶点坐标,只是为了得到旋转至平行于指定平面后顶点坐标的值。

该用户从未签到

发表于 2015-6-12 18:28:28 | 显示全部楼层
本帖最后由 buaahc 于 2015-6-12 18:30 编辑

我没有说你要改变顶点坐标,我回答的意思是物体坐标系下顶点位置永远不变,除非发生我说的那两种情况,因为物体坐标是在建模时候就已经确定好了。。再次确认一下 你到底是不是就是要求旋转之后的坐标位置,我理解错了?如果我没理解错,答案就是vertex*M,M是变换矩阵。如果我理解错了,请您详尽的描述一下到底要问什么。。。免得我误导,再一次看了你在一楼的问题问的是变换后的坐标位置。我不知你到底还有什么疑问与纠结。。。

该用户从未签到

 楼主| 发表于 2015-6-12 21:02:31 | 显示全部楼层
是的,你理解的应该是对的。我只需要的就是旋转之后的坐标值,那vertex*M中的vertex是物体坐标系下的顶点坐标吗?还是变换矩阵M怎么得到还是设置?

该用户从未签到

发表于 2015-6-12 21:22:34 | 显示全部楼层
本帖最后由 buaahc 于 2015-6-12 21:39 编辑

M=osg::coMputerLocalToworld(nodePath);

该用户从未签到

发表于 2015-6-12 23:22:28 | 显示全部楼层
osgxch 发表于 2015-6-12 21:02
是的,你理解的应该是对的。我只需要的就是旋转之后的坐标值,那vertex*M中的vertex是物体坐标系下的顶点坐 ...

小星星?

该用户从未签到

 楼主| 发表于 2015-6-14 10:49:03 | 显示全部楼层
buaahc 发表于 2015-6-12 21:22
M=osg::coMputerLocalToworld(nodePath);

还有一个问题就是我不是一下把所有顶点都转换,而是对每个三角面片的三个顶点单独处理,这样也可以吗?这样可以直接操控某个三角面片吗?

该用户从未签到

 楼主| 发表于 2015-6-14 10:56:38 | 显示全部楼层

该用户从未签到

发表于 2015-6-14 13:40:02 | 显示全部楼层
你只想转一个面片么,其他的不动?那需要把他单位作为一个drawable

该用户从未签到

 楼主| 发表于 2015-6-14 15:29:09 | 显示全部楼层
嗯,每个面片单独处理的,那我把需要把每个面片作为一个drawable对吧。然后旋转每个面片与某个平面平行该怎么做?
你可以留个QQ吗,我向你请教下

该用户从未签到

 楼主| 发表于 2015-6-14 15:35:25 | 显示全部楼层
buaahc 发表于 2015-6-14 13:40
你只想转一个面片么,其他的不动?那需要把他单位作为一个drawable

嗯,是的,每个面片需要单独旋转处理,那我需要把每个面片作为一个drawable对吧。怎么旋转一个面片使其与某个平面平行?
你可以留下QQ吗?我想你请教下。我是在实现一个曲面纹理合成算法,有许多问题还未解决。详细情况可以看我上传的附件,是讲解算法的那片文献。

算法介绍

算法介绍

基于纹理延伸和三角块拼接的快速曲面纹理合成.pdf

344.37 KB, 下载次数: 0, 下载积分: 威望 1

曲面纹理合成算法

该用户从未签到

发表于 2015-6-14 23:53:55 | 显示全部楼层
本帖最后由 buaahc 于 2015-6-15 00:05 编辑

对于如何将三角形旋转到与某个平面平行,我觉得你可以分别求得三角形的法线和平面的法线,然后求旋转矩阵,使三角形法线与平面法线一致,法线一致,自然就平行了

该用户从未签到

 楼主| 发表于 2015-6-19 16:19:55 | 显示全部楼层
这样获得的是osg::Matrix格式的世界坐标,然后怎么转为普通三维坐标形式的世界坐标呢?
osg::Matrix matrixOfRotate;
osg::ref_ptr<osg::MatrixTransform>mt = new osg::MatrixTransform;
osg::ref_ptr<osg::Vec3Array>vertexArray_Aft = new osg::Vec3Array;
float X0, Y0, Z0;
float s0, t0, s1, t1, s2, t2;
osg::Vec3 from = _normal->at(0);
osg::Vec3 to = osg::Vec3(0, 1, 0);
osg::Vec3 vertex0_Aft, vertex1_Aft, vertex2_Aft;

matrixOfRotate.makeRotate(from, to);
mt->addChild(_geode_Cur);
mt->setMatrix(matrixOfRotate);
osg::Matrix* wcMatrix=getWorldCoords(mt);

该用户从未签到

 楼主| 发表于 2015-6-19 16:21:40 | 显示全部楼层
buaahc 发表于 2015-6-14 23:53
对于如何将三角形旋转到与某个平面平行,我觉得你可以分别求得三角形的法线和平面的法线,然后求旋转矩阵, ...

这样得到的是osg::Matrix格式的世界坐标,怎么转换为普通三维坐标的世界坐标?
osg::Matrix matrixOfRotate;
osg::ref_ptr<osg::MatrixTransform>mt = new osg::MatrixTransform;
osg::ref_ptr<osg::Vec3Array>vertexArray_Aft = new osg::Vec3Array;
float X0, Y0, Z0;
float s0, t0, s1, t1, s2, t2;
osg::Vec3 from = _normal->at(0);
osg::Vec3 to = osg::Vec3(0, 1, 0);
osg::Vec3 vertex0_Aft, vertex1_Aft, vertex2_Aft;

matrixOfRotate.makeRotate(from, to);
mt->addChild(_geode_Cur);
mt->setMatrix(matrixOfRotate);
osg::Matrix* wcMatrix=getWorldCoords(mt);

该用户从未签到

发表于 2015-6-19 17:19:04 | 显示全部楼层
用顶点去乘以正确的矩阵即可,正确的矩阵m求法我之前已经说过了

该用户从未签到

发表于 2015-6-25 14:08:18 | 显示全部楼层
buaahc 发表于 2015-6-14 23:53
对于如何将三角形旋转到与某个平面平行,我觉得你可以分别求得三角形的法线和平面的法线,然后求旋转矩阵, ...

我当初就是这样告诉他的 哈哈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表