我有一个玩家位置,一个指示玩家观看方向的指针,一个距离和一个水平和垂直角。我想计算一个目标位置:
这是关于将Hololens-Application UI放置在玩家周围的球体中。用户界面应位于左侧40度,且与玩家观看方向相距20度。
编辑:添加了图片以说明问题。给出了玩家位置(pX | pY | pZ),半径(=黑色粗线的长度)和两个角度。
我正在寻找如何计算UI中心位置(x?| y?| z?)。
答案 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;
请尝试查看Quaternion和Quaternion.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);