【问题标题】:Point moving in circular path instead of straight line- OPENGL点在圆形路径而不是直线上移动 - OPENGL
【发布时间】:2020-05-06 13:44:48
【问题描述】:

我试图在 2d 中跟随光标。该点应始终位于光标的正下方。我曾尝试使用光线投射,但该点在圆形路径中移动,而不是 2d 直线。

我想也许我需要用平面来限制点的移动,但我不知道该怎么做。

   protected override void OnMouseMove(MouseMoveEventArgs e)
        {
            MouseState mstate = Mouse.GetCursorState();
            mousePos1 = this.PointToClient(new Point(mstate.X, mstate.Y));
        }



    protected override void OnRenderFrame(FrameEventArgs e)
        {

            Matrix4 projectionM = Matrix4.CreateOrthographicOffCenter(-1.05f, 1.05f, -1.25f, 1.25f, 
            -100f, 100.0f);
            Matrix4 viewM = Matrix4.Identity ;
            Vector3 cursorPos = raycasting(mousePos1.x, mousePos1.y, projectionM, viewM);
            float[] cursors = new float[] { cursorPos.X, cursorPos.Y,cursorPos.Z};
            //binding buffer arrays//
            shader4.Use();
            GL.UniformMatrix4(0, false, ref viewM);
            GL.UniformMatrix4(1, false, ref projectionM);
            shader4.SetFloat("color", new Vector4(1.0f, 1.0f, 1.0f, 1));
            GL.BindVertexArray(_vao);
            GL.PointSize(5);
            GL.DrawArrays(PrimitiveType.Points, 0, 1);
            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
            GL.BindVertexArray(0);
            shader4.Unbind();
           }

 private Vector3 raycasting(float X, float Y, Matrix4 proj, Matrix4 vi)
        {
                float x = (2.0f * X) /(float) this.Width - 1.0f;
                float y = 1.0f;
                float z = 1.0f;

                Vector3 normalized_device_coordinates_ray = new Vector3(x, y, z);

                // Homogeneous Clip Coordinates
                Vector4 homogeneous_clip_coordinates_ray = new Vector4(normalized_device_coordinates_ray.X, normalized_device_coordinates_ray.Y, -1.0f, 1.0f);

                // 4D Eye (Camera) Coordinates
                Vector4 camera_ray = Matrix4.Invert(proj) * homogeneous_clip_coordinates_ray;
                camera_ray = new Vector4(camera_ray.X, camera_ray.Y, -1.0f, 0.0f);

                // 4D World Coordinates
                Vector3 world_coordinates_ray = (Matrix4.Invert(vi) * camera_ray).Xyz;
                world_coordinates_ray.Normalize();

            return world_coordinates_ray;
        }

这有两个主要问题:

  1. 正如我所说,该点以圆周或径向移动,而不是像光标那样直线移动
  2. 该点不在光标的正下方。

【问题讨论】:

    标签: c# opengl opentk


    【解决方案1】:

    标准化的设备坐标在 [-1, 1] 范围内。从窗口坐标中获取NDC坐标如下:

    float x = 2.0f * X / (float)this.Width - 1.0f;
    float y = 1.0f - 2.0f * Y / (float)this.Height;
    

    一般来说,在通过逆投影矩阵 (Perspective divide) 进行变换后,您必须除以 xyz 分量除以 w 分量。您可以跳过它,因为您使用的是正交投影并且 w 分量是 1。

    但是由于您使用正交投影,因此您不计算射线,而是计算点。因此world_coordinates_ray 的规范化是错误的。

    Vector3 world_coordinates_ray = (Matrix4.Invert(vi) * camera_ray).Xyz;
    // world_coordinates_ray.Normalize(); <--- DELETE
    

    【讨论】:

    • 非常感谢您的帮助!!卡住了很长时间。这解决了移动问题,但是当鼠标移到屏幕两侧/边缘时,仍然有一点偏移量似乎会增加,但是当光标在原点附近时,偏移量就会消失。它背后的原因是什么?我该如何解决它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多