首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL鼠标在3D空间中的位置

OpenGL鼠标在3D空间中的位置
EN

Stack Overflow用户
提问于 2021-08-09 10:38:41
回答 1查看 222关注 0票数 0

我成功地实现了拾取光线球体的策略,以便获得单击的对象。在图中,我选择了绿色的立方体,左下角的顶点用一个红色的小立方体高亮显示。

但是我不能在平面z上移动立方体,特别是,我的鼠标位置与我在移动光标时发现的顶点位置不匹配。它仅适用于俯视图(XY平面)。

我快疯了,想知道我哪里错了,但我不能理解。

我确定我没听懂什么,但是是什么?

一开始,我存储鼠标x,y坐标(_init_drag_pos),然后在以前的坐标和新的坐标之间求差

代码语言:javascript
复制
dx = (mouse.X - _init_drag_pos.X); //pixel
dy = -1* (pmouse.Y - _init_drag_pos.Y); //pixel

//world position
vec3 res = glm.unProject(new vec3(mouse.Y, mouse.Y, 0), ModelViewMtx, ProjectionMtx, ViewPortVec);

我尝试了不同的方法,这是最有效的方法。阅读更多的文章!

我想看到与光标位置相同的红色立方体!

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2021-08-30 13:54:07

最后我发现了错误...它在我的配方里。

想法很简单:我得到光线矢量,并将其与平面相交。3D Line Segment and Plane Intersection

代码语言:javascript
复制
vec3 v1 = glm.unProject(new vec3(winX, winY, 0f), mModelView, vp.ProjectionMtx, vp.GetVPVector()); 
    
vec3 v2 = glm.unProject(new vec3(winX, winY, 1f), mModelView, vp.ProjectionMtx, vp.GetVPVector()); 
    
//intersection in z=0
vec3 intersection = XglHelper.GetPointIn3DSegment(v1, v2, 0);



public vec3 GetPointIn3DSegment(vec3 p1, vec3 p2, float z)
{
    float t = (z - p1.z) / (p2.z - p1.z);

    float x = (1 - t) * p1.x + t * p2.x;
    float y = (1 - t) * p1.y + t * p2.y;

    return new vec3(x,y,z);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68710666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档