2012-07-03 2 views
2

Je travaille sur un outil DCC comme une fenêtre 3D que vous pouvez vous déplacer avec votre souris, semblable à Maya, Blender, etc.Mise à l'échelle pan/zoom de la caméra 3D basé sur la distance pour cibler

I besoin d'aide pour certains calculs.

Il y a deux points que j'essaie de définir. Le premier est la vitesse de la dolly en fonction de la distance à la cible. Sur de petites échelles (disons, dist = 10^-3), il se traîne trop vite, et à grande échelle (disons, dist = 10^6), il traîne trop lentement. Je voudrais une entrée plate "vitesse de la caméra" qui fera évoluer l'effet global, mais à toutes les échelles, la caméra devrait ressentir la même chose. Cela ne devrait pas avoir d'importance si je suis à 0,1 ou 1000 unités, cela devrait me donner l'impression d'approcher la cible à la même vitesse pour un delta de souris donné.

L'autre est le panoramique de la caméra, également basé sur la distance de la caméra. Effectivement je veux que la cible de la caméra pour suivre le curseur de la souris parfaitement le long d'un plan qui est aligné avec la caméra et distance_to_target unités. Je ne suis pas sûr si la distorsion de la perspective va affecter cela?

Les entrées sont:

// Distance in world units to camera's centre of interest 
real distance_to_target 

// Number of pixels mouse has moved horizontally since last frame 
int mouse_delta_x 

// Number of pixels mouse has moved vertically since last frame 
int mouse_delta_y 

// The vector of the mouse delta, normalized into -1 to 1 space based on 
// viewport dimensions where a value of (-1,-1) or (1,1) means the cursor 
// moved from one corner of the viewport to the other, or further, since 
// the last frame. 
vec2 mouse_delta_vector 

// Scale the dolly speed 
real dolly_speed 

Habituellement je fais des trucs comme ça de façon empirique, en essayant différentes valeurs jusqu'à ce que je trouve quelque chose qui me plaît, mais pour cela, je pense qu'il est temps d'essayer la théorie.

Répondre

4

Pour le problème 1, utilisez simplement la mise à l'échelle proportionnelle. Où refSpeed ​​et refDistToTarget sont des valeurs que vous estimez acceptables par expérimentation. Comme pour le problème 2, l'idée est la même - c'est-à-dire que vous calculez un angle pondéré par la distance. Si votre champ de vision ne change jamais, vous pouvez essayer la même échelle de vitesse linéaire que celle mentionnée ci-dessus. L'essentiel ici est de trouver la valeur correcte pour refDistanceToTarget et refSpeed.

+0

:: headdesk :: Je m'étais convaincu que la réponse devait être plus compliquée que cela, mais elle avait un sens complet. Merci! –

Questions connexes