2017-10-06 3 views
1

J'ai un problème avec mon projet 3D. C'est assez compliqué de décrire le but, alors j'essaie de l'abstraire au minimum. J'ai un flux vidéo en direct du programme d'unité que j'apporte en plein écran (1920 x 1200). Un utilisateur clique sur l'écran pour envoyer les coordonnées à l'application de l'unité.Comment régler la direction de Raycast à 90 degrés au lieu de passer par la caméra

coords envoi:

// relative coord 
float x = mouse_x/1920.0f; 
float y = mouse_y/1200.0f; 

Le récepteur est l'application de l'unité, qui essaye de faire une 3D coordonnée et trouve un mur ou un obstacle pour placer une marque.

1. Attempt 
// 1268 x 720 receiver viewport size 
Ray ray = Camera.main.ScreenPointToRay(new Vector3(Position.x * 1268.0f, Position.y * 720.0f, 0)); 

2. Attempt 

// * 1268 not necessary 
Vector3 far = Camera.main.ViewportToWorldPoint(new Vector3(fix.Position.x, fix.Position.y, 1)); 

Vector3 near = Camera.main.ViewportToWorldPoint(new Vector3(fix.Position.x, fix.Position.y, 0)); 

Vector3 dir = far - near; 
dir.Normalize(); 

Ray ray = new Ray(near, dir); 

RaycastHit hitInfo; 

if(Physics.Raycast(ray, out hitInfo)) 
{ 
// place mark 
} 

enter image description here

Les deux résultats des tentatives de la même manière. Si la coordonnée est autour du centre, elle se trouve également au centre du récepteur. Mais plus il va au bord, il sera beaucoup plus loin de la position qu'il devrait être. La photo montre ce que je pense arrive. Le cercle rouge est le comportement actuel et le vert est ce que j'attendais. Je préférerais avoir un rayon de 90 degrés de l'écran au mur plutôt qu'à travers la caméra. Je ne sais vraiment pas quoi faire. Merci beaucoup pour votre aide à l'avance.

+0

La fenêtre est pas une entité * de l'espace physique *, de sorte que vous avez diagramme est source de confusion. Vous devez spécifier une distance * plan de projection *, qui est la distance perpendiculaire de la position de la caméra au plan à partir de. que vous voulez que les rayons commencent – meowgoesthedog

Répondre

1

Vous avez raison à propos de votre dessin, c'est effectivement ce qui se passe.

Voici un test que j'ai fait en utilisant Debug.DrawRay. enter image description here

Le rayon bleu est la sortie de ce code.

Debug.DrawRay(Camera.main.transform.position, Camera.main.transform.forward * 100f, Color.red); 

Et voici le dessin du rouge, comme vous l'avez fait. Je m'attendais à une réponse vraiment simple mais je n'étais pas capable d'en trouver un. J'ai trouvé un truc pour faire ce que tu veux.

var ray = new Ray(viewportPointRay.origin, Camera.main.transform.forward); 
Debug.DrawRay(ray.origin, ray.direction, Color.green); 

Résultat enter image description here