Seit ich 13 war und mit AMOS 3D herumspielte, wollte ich lernen, wie man 3D-Grafiken programmiert. Jetzt, 10 Jahre später, denke ich, dass ich genug Mathe angehäuft habe, um es auszuprobieren.Rotierendes 3D-Würfel-Perspektive-Problem
Ich habe verschiedene Tutorials gefolgt, und definiert screenX (und screenY äquivalent) als
screenX = (pointX * cameraX)/distance
(Plus-Offsets und Skalierung.)
Mein Problem mit dem, was ist der Abstand Variable tatsächlich bezieht. Ich habe gesehen, dass Entfernung als der Unterschied in z zwischen der Kamera und dem Punkt definiert ist. Das kann jedoch nicht völlig richtig sein, da x und y den gleichen Effekt wie z auf die tatsächliche Entfernung von der Kamera zum Punkt haben. Ich habe die Entfernung als die tatsächliche Entfernung eingeführt, aber das Ergebnis gibt eine etwas verzerrte Perspektive, als hätte es eine "zu viel" Perspektive.
Meine "tatsächliche Entfernung" Umsetzung entlang der Linien war:
distance = new Vector(pointX, pointY, cameraZ - pointZ).magnitude()
Herumspielen mit dem Code, habe ich eine zusätzliche Variable auf meine Gleichung, eine perspectiveCoefficient wie folgt:
distance = new Vector(pointX * perspectiveCoefficient,
pointY * perspectiveCoefficient, cameraZ - pointZ).magnitude()
Aus irgendeinem Grund, das ist jenseits von mir, ich neige dazu, das beste Ergebnis zu erhalten, indem ich den perspectiveCoefficient auf 1/sqrt (2) setze.
Mein 3D-Testwürfel ist um http://vega.soi.city.ac.uk/~abdv866/3dcubetest/3dtest.svg. (Getestet in Safari und FF.) Es fordert Sie zu einem perspektivischen Koeffizienten auf, wobei 0 eine Perspektive ohne Berücksichtigung der x/y-Entfernung angibt, und 1 gibt Ihnen eine Perspektive, in der die x-, y- und z-Entfernung gleichermaßen berücksichtigt wird. Es ist standardmäßig 1/sqrt (2). Der Würfel kann mit den Pfeiltasten um x und y gedreht werden. (Für jeden Interessierten befindet sich der entsprechende Code in update() in der View.js Datei.)
Dankbar für irgendwelche Ideen dazu.
+1 für eine gut geschriebene Frage und eine sehr coole interaktive 3D-SVG-Datei. –