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

但是我不能在平面z上移动立方体,特别是,我的鼠标位置与我在移动光标时发现的顶点位置不匹配。它仅适用于俯视图(XY平面)。
我快疯了,想知道我哪里错了,但我不能理解。
我确定我没听懂什么,但是是什么?
一开始,我存储鼠标x,y坐标(_init_drag_pos),然后在以前的坐标和新的坐标之间求差
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);我尝试了不同的方法,这是最有效的方法。阅读更多的文章!
我想看到与光标位置相同的红色立方体!
有什么建议吗?
发布于 2021-08-30 13:54:07
最后我发现了错误...它在我的配方里。
想法很简单:我得到光线矢量,并将其与平面相交。3D Line Segment and Plane Intersection
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);
}https://stackoverflow.com/questions/68710666
复制相似问题