通过角度差创建Vector3位置

时间:2018-11-27 18:09:09

标签: c# unity3d

我有一个玩家位置,一个指示玩家观看方向的指针,一个距离和一个水平垂直角。我想计算一个目标位置

  • 距离玩家位置
  • 的距离
  • 从玩家观看方向水平角度 右侧和垂直角向上

这是关于将Hololens-Application UI放置在玩家周围的球体中。用户界面应位于左侧40度,且与玩家观看方向相距20度。

编辑:添加了图片以说明问题。给出了玩家位置(pX | pY | pZ),半径(=黑色粗线的长度)和两个角度。

我正在寻找如何计算UI中心位置(x?| y?| z?)。

enter image description here

4 个答案:

答案 0 :(得分:2)

您可以使用Quaternion.Euler根据世界空间中的角度创建旋转,然后通过将其乘以已知位置来获得所需的结果。

因此,通过使用您的示例,您可以找到以下位置:

float radius, x_rot, y_rot;
Vector3 forwardDirection, playerPos;

Vector3 forwardPosition = playerPos + (forwardDirection * radius);
Vector3 targetPosition = Quaternion.Euler(x_rot, y_rot, 0) * forwardPosition;

请尝试查看QuaternionQuaternion.AngleAxis上的文档,以获取更多方便的轮换内容。

答案 1 :(得分:1)

// Set UI in front of player with the same orientation as the player
ui.transform.position = player.transform.position + player.transform.forward * desiredDistance;
ui.transform.rotation = player.transform.rotation;

// turn it to the left on the players up vector around the the player
ui.transform.RotateAround(player.transform.position, player.transform.up, -40);

// Turn it up on the UI's right vector around the player
ui.transform.RotateAround(player.transform.position, ui.transform.right, 20);

假设您还希望UI面对播放器,否则必须在此之后设置另一个旋转角度。

无需自己计算,Unity API已经为您完成了( 参见Rotate around

答案 2 :(得分:0)

如果我对您的理解正确,则希望创建一个悬停在某点之上的UI。我最近在游戏中做了类似的事情。这就是我的做法。

 if (Input.GetMouseButtonDown(0)) // use the ray cast to get a vector3 of the location your ui      
                                 // you could also do this manualy of have the computer do it the main thing is to 
                                  // get the location in the world where you want your ui to be and the
                                 // WorldTOScreenPoint() will do the rest
        {
            RaycastHit hit;
            Vector3 pos;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            if (Physics.Raycast(ray, out hit))
            {
                pos = hit.point;
                pos.y += yOffset; // use the offset if you want to have it hover above the point
                ui.transform.position = cam.WorldToScreenPoint(pos); // use your main cammera here              
                // then either make your ui vissible or instanciati it here and make sure if you instanciate it 
                // that you make it a child of your cnavas


            }
        }

我希望这可以解决您的问题。如果我不明白您要做什么,请告诉我,我会尽力提供帮助。

注意:如果要使ui在远离点时看起来更远,则将ui随距离越远而缩小,并在距离近时将其放大。

答案 3 :(得分:0)

数学家的答案:

要使用给定的信息(物体之间的距离,x角,y角)来计算球形位置,请使用三角函数:

float x = distance * Mathf.Cos(yAngle) * Mathf.Sin(xAngle);
float z = distance * Mathf.Cos(yAngle) * Mathf.Cos(xAngle);
float y = distance * Mathf.Sin(yAngle);

ui.transform.position = player.transform.position + new Vector3(x,y,z);