2010-12-03 8 views
2

Il s'agit plus d'un problème mathématique que d'un problème de programmation.Visual Basic .Net 3D Engine

J'ai créé un moteur 3D très basique en utilisant Visual Basic .Net. Il affiche des lignes sur l'écran avec un axe z supplémentaire. Le moteur fonctionne, mais lorsqu'une partie de la ligne passe en dessous de 0, cela crée des dégâts et commence à tracer de nouveau la ligne inversée.

Voici comment il calcule les points:

y = (point.y/z) + offset.y + camera.y 
x = (point.x/z) + offset.x + camera.x 

Quelqu'un peut-il trouver un moyen de tirer une partie seulement de la ligne quand il coupe l'axe z = 0?

(code source) http://www.mediafire.com/?ww77q26ywj3a5ry

+0

Le lien MediaFire est plus disponible. –

Répondre

2

Vous voulez dessiner tout où z> 0 parce que tout est en dessous de zéro derrière la caméra et où Z == zéro, cela va exploser parce que vous ne pouvez pas diviser par zéro. Donc, je ferais ceci: ('scuse C#, mais cela devrait être le même de toute façon)

y = z > 0 ? (point.y/z) + offset.y + camera.y : 10000; 
x = z > 0 ? (point.x/z) + offset.x + camera.x : 10000; 

Lorsque la valeur 10000 est quelque chose d'assez grand qui n'apparaîtra sur votre écran.

Si votre axe z pointe dans la direction opposée, vous aurez envie de faire:

y = z < 0 ? -1*(point.y/z) + offset.y + camera.y : 10000; 
x = z < 0 ? -1*(point.x/z) + offset.x + camera.x : 10000; 
+0

vous pouvez simplement utiliser Math.Sign (z) – Evgeny

+0

Merci, mais cela ne résout toujours pas le problème, car les lignes ont deux points, si l'un si z => 0 et l'autre est z = <0, alors la ligne disparaîtra. Comment pourrais-je contourner cela? – PlyPencil

+0

Un de ces points sera derrière la caméra et l'autre devant. Vous devrez faire une interpolation linéaire pour trouver les points x et y où z = 0. – Kell