Rotera 3d-kub i C++
Jag experimenterar lite i C++ och har gjort en kub som jag vill rotera med hjälp utav piltangenterna.
Jag använder mig inte utav något 3d-bibliotek utan har bara 8 punkter som jag ritar ut med hjälp av ett 2d-bibliotek (allegro).
Det jag inte lyckas få att fungera är att rotera kuben runt två axlar samtidigt, jag kan t.ex. rotera den runt X-axeln utan problem, men försöker jag samtidigt göra en rotation runt Y-axeln så ger det en konflikt som gör att kuben förlorar sin form och allt blir fel.
Problemet ligger i denna koden (x, y och z är definierade som 0,1,2 för lättare läslighet)
for(int i = 0; i<8; i++) {
cube[i][x] = (sin(cubeA[y]) * cube_orig[i][z])+(cos(cubeA[y]) * cube_orig[i][x]);
cube[i][y] = (cos(cubeA[x]) * cube_orig[i][y])-(sin(cubeA[x]) * cube_orig[i][z]);
cube[i][z] = (-sin(cubeA[x]) * cube_orig[i][x]) +
((sin(cubeA[x])* cos(cubeA[y])) * cube_orig[i][y]) +
((cos(cubeA[x]) * cos(cubeA[y])) * cube_orig[i][z]);
}
X- och Y-variablerna tror jag ändras rätt, men Z-variabeln ändras olika beroende på om man vill rotera runt X- elelr Y-axeln.
T.ex. om jag bara vill rotera runt X-axeln använder jag denna koden:
cube[i][y] = (cos(cubeA[x]) * cube_orig[i][y])-(sin(cubeA[x]) * cube_orig[i][z]);
cube[i][z] = (sin(cubeA[x]) * cube_orig[i][y])+(cos(cubeA[x]) * cube_orig[i][z]);
och runt Y-axeln denna koden:
cube[i][x] = (sin(cubeA[y]) * cube_orig[i][z])+(cos(cubeA[y]) * cube_orig[i][x]);
cube[i][z] = -(sin(cubeA[y]) * cube_orig[i][x])+(cos(cubeA[y]) * cube_orig[i][z]);
Alltså vill de båda ändra Z-axeln olika, och jag lyckas inte lista ut hur jag ska kombinera de två för att det ska bli rätt.
Har googlat runt en hel del utan att hitta nåt som hjälpt. Tänkte att nån här kanske sysslat med sånt här tidigare och vet hur man ska göra.
Bifogar en länk till programfilen ifall ni vill se hur koden fungerar just nu (jag använder det översta kodexemplet i den)
Raderad eftersom jag glömde inkludera en fil i rar-arkivet
Den gröna punkten är kubens mittpunkt och AX/AY är kubens rotation runt X/Y-axlarna i radianform.
Använd piltangenterna för att se hur rotationen funkar just nu.