随笔 - 132  文章 - 51  trackbacks - 0
<2011年4月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

文章档案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新评论

阅读排行榜

评论排行榜

我们可以通过gluUnProject函数来求得世界坐标
void ILGameModule::getWorldPos( int x, int y, vec3& vWorld )
{
    JFIX vx 
= (JFIX)x;
    JFIX vy 
= (JFIX)camera->viewport.h - y;
    JFIX winz 
= 0.f;
    glReadBuffer(GL_FRONT);
    glReadPixels( (JINT)vx, (JINT)vy, 
11, GL_DEPTH_COMPONENT, GL_FLOAT ,&winz );
    
//winz = getWinDepth( camera, 1.f );
    GLdouble model[ 16 ];
    GLdouble project[
16];
    
    mat4 matView 
= camera->modelView.transpose();
    mat4 matProj 
= camera->projection.transpose();
    JFIX
* pm = matView.ptr();
    JFIX
* pj = matProj.ptr();
    
forint i = 0; i < 16; i++ ){
        model[i] 
= (GLdouble)(pm[i]);
        project[i] 
= (GLdouble)(pj[i]);
    }
    

    GLdouble lx,ly,lz;
    gluUnProject( vx, vy, winz, model,project,(
int*)&camera->viewport, &lx, &ly, &lz );
    vWorld.x 
= (JFIX)lx;
    vWorld.y 
= (JFIX)ly;
    vWorld.z 
= (JFIX)lz;
}

求出的世界坐标MS不符合我们的要求,例如我点击了世界坐标的点击屏幕(sx,sy),利用getWorldPos还原后的世界坐标为(100,100,20 ),在(100,100,20)这个点画模型,
 的确在鼠标点击位置,问题出现了: 还原后的世界坐标Z = 20,但是我们画的物体的高度要求是0的话,紧贴地面,会出现模型浮空
 仅仅将Z=0,却使得点击仿佛偏移了

我们需要知道在拣选射线和我们想指定的高度面(如Z=0面)的交点,这个交点可定也在拣选射线上 vIntersection  = vWorld + vOffset;
即在我们得到的世界坐标基础上,加上拣选射线的一个偏移值就得到了我们的交点(X', Y', 0 )

//vWorld世界坐标 PLANE_Z Z平面, Z=0平面,返回和当前面相交的交点
snapWorldPos( vWorld, PLANE_Z, 0&vWorld );
void ILGameModule::snapWorldPos( vec3& vWorld, JINT nPlane, JFIX dist, vec3* pOut )                 // dist就是当前相交的面,以后也可以传入当前地形的高度getHeight(vWorld)
{
    vec3 vdir 
= camera->pos - vWorld;
    vdir.normalise();
    vec3 vPlane;

    
switch( nPlane )
    
{
    
case PLANE_X: vPlane = vec3( 1,0,0 ); break;
    
case PLANE_Y: vPlane = vec3( 0,1,0 ); break;
    
case PLANE_Z: vPlane = vec3( 0,0,1 ); break;
    }


    JFIX rate;
    JFIX nf 
= vdir.dot(vPlane);
    
if ( nf == 0.f ) rate = 0.f;
    
else
        rate 
= ( 1000+ dist - vWorld.dot(vPlane) )/nf;
    
    
if ( pOut ){
        vdir 
*= rate;
        
*pOut = vWorld + vdir;
    }

}
posted on 2010-06-07 14:56 风轻云淡 阅读(1242) 评论(0)  编辑 收藏 引用 所属分类: OpenGL

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理