Criar uma posição Vector3 por diferenças de ângulo

votos
2

I tem uma posição do jogador , um ponteiro que indica os jogadores visualizar direcção , uma distância e uma horizontal e ângulo vertical . Eu quero calcular uma posição de destino :

  • que é a distância para longe da posição de jogadores
  • que, a partir dos jogadores visualizar sentido , é ângulo horizontal para a direita e ângulo vertical para cima

É sobre o posicionamento de um UI Hololens-Aplicação em uma esfera em torno do jogador. A interface do usuário deve ser ou seja, 40 graus para a leftand 20 graus para cima dos jogadores visualizar direção.

Editar : Imagem Adicionado esclarecer. Dado é o jogador Pos (px | pY | pZ), o raio (= comprimento da linha em negrito preto) e ambos os ângulos em graus.

Eu estou procurando a forma de calcular a posição UI Center (x |? Y |? Z?).

digite

Publicado 27/11/2018 em 18:09
fonte usuário
Em outras línguas...                            


4 respostas

votos
2

Você pode usar Quaternion.Euler para criar uma rotação com base em ângulos no espaço mundial e, em seguida, obter o resultado desejado, multiplicando-o com uma posição conhecida.

Então, usando o seu exemplo, você poderia encontrar a posição como esta:

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

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

Tente verificar os docs sobre Quaternion e Quaternion.AngleAxis para mais coisas rotação calhar.

Respondeu 27/11/2018 em 23:32
fonte usuário

votos
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);

supondo que você também quer a interface do usuário para enfrentar o jogador, caso contrário, você tem que definir outra rotação depois disso.

Não há necessidade de calcular-lo sozinho, a Unidade API já faz isso por você (veja girar em torno )

Respondeu 27/11/2018 em 21:39
fonte usuário

votos
0

Resposta por um matemático:

Para calcular a posição esférica com a informação dada (distância entre objetos, x ângulo, y ângulo) você usa trigonometria:

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);
Respondeu 28/11/2018 em 14:55
fonte usuário

votos
0

Se eu estou entendendo você corretamente você deseja criar uma interface que paira acima de um ponto. Recentemente, fiz uma coisa semelhante no meu jogo. e é assim que eu fiz isso.

 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


            }
        }

Espero que isso resolve o seu problema. Se eu não estou entendendo o que você está tentando fazer, deixe-me saber e eu vou tentar ajudar.

Nota: se você quiser fazer as ui olhar mais longe quando você se afastar da escala de pontos do ui para baixo como você se move para mais longe, e escala-lo quando você se aproxima.

Respondeu 27/11/2018 em 18:59
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more