读取深度缓存中的深度值,并将其屏幕2D坐标转化为场景3D坐标

转载自:http://blog.csdn.net/skyman_2001

1. 使用双缓存,打开深度测试:

 glClearDepth(1.0f);         //  深度缓存设置
 glEnable(GL_DEPTH_TEST);       //  打开深度测试
 glDepthFunc(GL_LEQUAL);        //  设置深度测试类型

2. 绘制场景:

3. 在WM_MOUSE消息下:

   mouse_x=LOWORD(lParam);//鼠标的x坐标
   mouse_y=HIWORD(lParam);//鼠标的y坐标
   glGetDoublev(GL_MODELVIEW_MATRIX, modelview);//视图矩阵
   glGetDoublev(GL_PROJECTION_MATRIX, projection);//投影矩阵
   glGetIntegerv(GL_VIEWPORT, viewport);//视口
   winX=(float)mouse_x;//OGL中的窗口x坐标
   winY=(float)viewport[3]-(float)mouse_y;//OGL中的窗口y坐标
   glReadPixels(mouse_x,//x坐标
                     int(winY),//y坐标
                    1,1,//读取一个像素
                    GL_DEPTH_COMPONENT,//获得深度信息
                    GL_FLOAT,//数据类型为浮点型
                    &winZ);//获得的深度值保存在winZ中
   gluUnProject((GLdouble)winX,(GLdouble)winY,(GLdouble)winZ,modelview,projection,viewport,&object_x,&object_y,&object_z);
//获得OGL中的x,y,z坐标值

注:深度值winZ的范围为0.0~1.0,近截面处为0.0,远截面处为1.0,其他介于0.0和1.0之间。

下面我们来验证一下:

(由于抓图时没法抓鼠标,所以看不到鼠标位置,我只能用文字说明)

1.下图是鼠标点在黑色背景区域时的场景点坐标(见标题栏):

由图中可以看出:深度值winz=1.0,场景坐标ox=38.3,oy=12.9,oz=-100.0。

黑色背景区域是远截面,所以其深度值为1.0;而视见体我们是这样设置的:

gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

所以远截面上的点的z坐标为-100.0f。所以是正确的。

2.下图是鼠标点在球的中心处时的场景点坐标(见标题栏):

由图中可以看出,深度值winz=0.93,场景坐标ox=0.0,oy=0.0,oz=-1.5。

2个球是这么绘制的:

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
 glLoadIdentity();  
 glPushMatrix();
   glTranslatef(0.0f,0.0f,-2.0f);
      auxSolidSphere(0.5f);
      glPushMatrix();
          glTranslatef(0.04f,0.04f,-0.04f);
          auxSolidSphere(0.5f);
      glPopMatrix();
 glPopMatrix();
 glFlush();

所以第一个球的正朝我们的面的中心点(就是我们这个鼠标点)的z坐标为-2.0+0.5=-1.5,吻合!

所以,这个程序是正确的!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取Mediapipe的Landmark3D坐标,您可以使用以下代码: ```python import mediapipe as mp mp_drawing = mp.solutions.drawing_utils mp_holistic = mp.solutions.holistic # 初始化模型 holistic = mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) # 读取输入图像 image = cv2.imread("your_image.jpg") # 将图像转换为RGB格式 image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 检测姿势和面部表情 results = holistic.process(image) # 获取Landmark3D坐标 landmarks_3d = results.pose_landmarks.landmark # 打印第一个Landmark3D坐标 print(landmarks_3d[0].x, landmarks_3d[0].y, landmarks_3d[0].z) ``` 要将Landmark3D坐标转换为相对于UE5玩家出生点的坐标系,您需要知道玩家出生点在世界坐标的位置。假设玩家出生点在世界坐标的位置是(100, 200, 300),您可以使用以下代码将Landmark3D坐标转换为相对于玩家出生点的坐标系: ```python # 定义玩家出生点在世界坐标的位置 player_spawn_location = [100, 200, 300] # 将Landmark3D坐标转换为相对于玩家出生点的坐标系 landmarks_relative = [] for landmark in landmarks_3d: x = landmark.x * image_width + image_width / 2 y = landmark.y * image_height + image_height / 2 z = landmark.z landmark_relative = [x - player_spawn_location[0], y - player_spawn_location[1], z - player_spawn_location[2]] landmarks_relative.append(landmark_relative) # 打印第一个Landmark3D的相对坐标 print(landmarks_relative[0]) ``` 在上述代码,我们首先定义了玩家出生点在世界坐标的位置,然后对每个Landmark3D坐标进行转换,将其从图像坐标系转换为世界坐标系,并将其减去玩家出生点的位置,以获得相对于玩家出生点的坐标坐标
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值