Geachte Tweakers,
Ik heb een ledmatrix gemaakt met ws2812 ledjes en daar hebben we software voor gemaakt om mooie plaatjes en animaties weer te geven. (https://github.com/psy0rz/ledder)
Dat gaat allemaal best prima, maar nu kreeg ik het idee om 3D objecten weer te geven op de led-matrix. Op zich heb ik redelijk wat programmeerervaring (>40 jaar) maar mijn wiskunde-knobbel heeft zich in de loop der jaren omgevormd tot een vetkwab. En dat is dan ook de reden dat ik hulp vraag. De code klopt wel maar de wiskunde achter de code klopt waarschijnlijk niet.
De onderstaande code is in javascript/typescript. Dit zijn 3 functies, rotateX, rotateY en rotateZ die een object om zijn eigen as moeten laten draaien.
De X en Y rotatie lijken goed te werken, en geven een 3d object terug. Het ziet er goed uit (maar dat kan toeval zijn).
Bij de Z rotatie lijkt alles in een plat vlak te vallen. Dus die klopt niet.
Heb ik een sinus en een cosinus verwisseld? staan er plusjes en minnetje verkeerd? Ik heb zelf gezocht en geprobeerd maar ik denk dat ik iets over het hoofd zie want als ik dingen verander dan wordt het erger.
Ik heb een ledmatrix gemaakt met ws2812 ledjes en daar hebben we software voor gemaakt om mooie plaatjes en animaties weer te geven. (https://github.com/psy0rz/ledder)
Dat gaat allemaal best prima, maar nu kreeg ik het idee om 3D objecten weer te geven op de led-matrix. Op zich heb ik redelijk wat programmeerervaring (>40 jaar) maar mijn wiskunde-knobbel heeft zich in de loop der jaren omgevormd tot een vetkwab. En dat is dan ook de reden dat ik hulp vraag. De code klopt wel maar de wiskunde achter de code klopt waarschijnlijk niet.
De onderstaande code is in javascript/typescript. Dit zijn 3 functies, rotateX, rotateY en rotateZ die een object om zijn eigen as moeten laten draaien.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| rotateX(degrees:number) { let degreesRad=degrees * (Math.PI / 180) //deg to rad let sinTheta=Math.sin(degreesRad) let cosTheta=Math.cos(degreesRad) for (let p=0;p<this.points.length;p++) { let point=this.points[p].projection this.points[p].projection.y= ((point.y * cosTheta) - (point.z * sinTheta)) this.points[p].projection.z= ((point.z * cosTheta) + (point.y * sinTheta)) } } rotateY(degrees:number) { let degreesRad=degrees * (Math.PI / 180) //deg to rad let sinTheta=Math.sin(degreesRad) let cosTheta=Math.cos(degreesRad) for (let p=0;p<this.points.length;p++) { let point=this.points[p].projection this.points[p].projection.x= ((point.x * cosTheta) + (point.z * sinTheta)) this.points[p].projection.z= ((point.z * cosTheta) + (point.x * sinTheta)) } } rotateZ(degrees:number) { let degreesRad=degrees * (Math.PI / 180) //deg to rad let sinTheta=Math.sin(degreesRad) let cosTheta=Math.cos(degreesRad) for (let p=0;p<this.points.length;p++) { let point=this.points[p].projection this.points[p].projection.x= ((point.x * cosTheta) - (point.y * sinTheta)) this.points[p].projection.y= ((point.y * cosTheta) + (point.x * sinTheta)) } } |
De X en Y rotatie lijken goed te werken, en geven een 3d object terug. Het ziet er goed uit (maar dat kan toeval zijn).
Bij de Z rotatie lijkt alles in een plat vlak te vallen. Dus die klopt niet.
Heb ik een sinus en een cosinus verwisseld? staan er plusjes en minnetje verkeerd? Ik heb zelf gezocht en geprobeerd maar ik denk dat ik iets over het hoofd zie want als ik dingen verander dan wordt het erger.