簡體   English   中英

點在圓形路徑而不是直線上移動 - OPENGL

[英]Point moving in circular path instead of straight line- OPENGL

我試圖在二維中關注 cursor。 該點應始終位於 cursor 的正下方。 我嘗試過使用光線投射,但該點在圓形路徑中移動,而不是 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. 正如我所說,該點以圓形或徑向運動而不是像 cursor 那樣的直線運動
  2. 重點不在 cursor 的正下方。

在此處輸入圖像描述

標准化設備坐標在 [-1, 1] 范圍內。 從 window 坐標中獲取 NDC 坐標,如下所示:

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

通常,在通過逆投影矩陣( 透視除法)進行變換后,您必須除以xyz分量除以 w 分量。 您可以跳過它,因為您使用正交投影並且 w 分量為 1。

但是由於您使用正交投影,因此您不計算射線,而是計算點。 因此world_coordinates_ray的歸一化是錯誤的。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM