Une explication de la partie de SceneViewer.mouseDragged(), dans SimpleModeller.java, qui redimensionne les boîtes
( old_mouse_x, old_mouse_y ) ( mouse_x, mouse_y ) ray1 n ray2
( old_mouse_x, old_mouse_y ) ( mouse_x, mouse_y ) ray1 n ray2 Ces deux points sont les intersections entre ray1 et ray2 avec une face de la boîte. On pourrait prendre la différence entre ces points pour obtenir un vecteur de translation, mais ce vecteur serait parallèle au plan de la face. On cherche plutôt un vecteur parallèle à n; un genre de projection de (ray2.origin – ray1.origin) sur n.
( old_mouse_x, old_mouse_y ) ( mouse_x, mouse_y ) ray1 n ray2 Nous allons donc bâtir un plan P qui passe par ce point, et qui est parallèle à n. Nous allons ensuite trouver les intersections entre ray1 et ray2 avec le plan P, et utiliser la différence entre ces intersections comme vecteur final. Notez qu’il y a une infinité de plans passant par le point surligné qui sont parallèles à n. Parmi cette infinité de plans, nous choisirons celui qui est le plus perpendiculaire possible à ray1.
( old_mouse_x, old_mouse_y ) ( mouse_x, mouse_y ) ray1 n ray2 intersection1
( old_mouse_x, old_mouse_y ) ( mouse_x, mouse_y ) ray1 n v1 ray2 intersection1 v1 = n × ray1.direction Nous cherchons un plan P passant par intersection1 qui est parallèle à n et parallèle à v1
( old_mouse_x, old_mouse_y ) ( mouse_x, mouse_y ) ray1 n v1 v2 ray2 intersection1 v2 = n × v1 Nous cherchons un plan P passant par intersection1 qui est perpendiculaire à v2
( old_mouse_x, old_mouse_y ) ( mouse_x, mouse_y ) ray1 n v1 v2 ray2 intersection1 Voici le plan P passant par intersection1, perpendiculaire à v2, et parallèle à n et parallèle à v1
( old_mouse_x, old_mouse_y ) ( mouse_x, mouse_y ) ray1 n v1 v2 ray2 intersection2 intersection1 intersection1 et intersection2 sont les intersections entre ray1 et ray2 avec le plan P. La différence (intersection2-intersection1) est un vecteur parallèle à n dont la longueur correspond au changement de dimension désiré pour la boîte.