|
楼主 |
发表于 2011-7-23 19:43:03
|
显示全部楼层
恩,非常谢谢你这么耐心的解答。
我目前的想法跟您是一样的,我在单击的时候取出来图片的四个顶点坐标,然后根据这些坐标算出这张图片的法向量,然后在根据法向量算出相机的位置,进而设置相机的属性,代码如下:- osg::Vec3Array* v = dynamic_cast<osg::Vec3Array*>(geometry->getVertexArray());
- double v1[2], v2[2];
- double A[3][3];//顶点坐标
- //求法向量
- double na = A[0][1] * (A[1][2] - A[2][2]) + A[0][2] * (A[1][1] - A[2][1]) + (A[1][1] * A[2][2] - A[2][1] * A[1][2]);
- double nb = A[0][0] * (A[1][2] - A[2][2]) + A[0][2] * (A[1][0] - A[2][0]) + (A[1][0] * A[2][2] - A[2][0] * A[1][2]);
- double nc = A[0][0] * (A[1][1] - A[2][1]) + A[0][1] * (A[1][0] - A[2][0]) + (A[1][0] * A[2][1] - A[2][0] * A[1][1]);
- //求中心点的坐标
- double cx = (A[0][0] + A[2][0])/2;
- double cy = (A[0][1] + A[2][1])/2;
- double cz = (A[0][2] + A[2][2])/2;
- double eyeX = cx + na;
- double eyeY = cy + (-1) * nb;
- double eyeZ = cz + nc;
- double upX = A[1][0] - A[0][0];
- double upY = A[1][1] - A[0][1];
- double upZ = A[1][2] - A[0][2];
- mHUDCamera->setViewMatrixAsLookAt(osg::Vec3d(eyeX, eyeY, eyeZ), osg::Vec3d(cx, cy, cz), osg::Vec3d(upX, upY, upZ));
- mHUDCamera->setProjectionMatrixAsOrtho2D(cx - mWidth/2, cx + mWidth/2,cy - mWidth/2, cy + mWidth/2);
- mHUDCamera->setNodeMask(0);
- mGnode = geode;
- mHUDCamera->addChild(geode);
复制代码 我这样的做法,有没有什么问题嘛? |
|