Witajcie,
Od jakiegoś czasu, po godzinach piszę prosty silnik 3D, jednak pojawił się problem z którym nie mogę sobie poradzić. Założeniem było napisanie prostego programu w którym mogę w 3d obracać sześciany. Program jest napisany w C# i problemem jest sposób, w jaki określić współrzędne kursora w tym trójwymiarowym świecie. ;/
Fragment programu wygląda tak:
Nic skomplikowanego, rysownica, kilka suwaków do obrotu kamery, etykiety z aktualnymi wartościami. Na rysownicy niebieskie linie są na współrzędnych o wysokości 0, skrzyżowanie dwóch pomarańczowych linii o punkt 0,0, dwóch czerwonych to środek ekranu.
Program działa w taki sposób, że każdyz punktów jest klasą Vector3D z zmiennymi X,Y,Z Przed ich rysowaniem jest wykonywana funkcja generująca dla każdego punktu współrzędne 2D, które potem są widoczne na rysownicy.
Do wykonywania obrotu geometrii stosuję taki kod:
if (cam.RotateZ.Value != 0)
{
var x = input.X * cam.RotateZ.ValueCosinus + input.Y * cam.RotateZ.ValueSinus;
var y = input.X * -cam.RotateZ.ValueSinus + input.Y * cam.RotateZ.ValueCosinus;
input.X = x;
input.Y = y;
}
if (cam.RotateY.Value != 0)
{
var x = input.X * cam.RotateY.ValueCosinus + input.Z * cam.RotateY.ValueSinus;
var z = input.X * -cam.RotateY.ValueSinus + input.Z * cam.RotateY.ValueCosinus;
input.X = x;
input.Z = z;
}
if (cam.RotateX.Value != 0)
{
var y = input.Y * cam.RotateX.ValueCosinus + input.Z * cam.RotateX.ValueSinus;
var z = input.Y * -cam.RotateX.ValueSinus + input.Z * cam.RotateX.ValueCosinus;
input.Y = y;
input.Z = z;
}
cam - to inaczej klasa kamery w której mam zapisane wartości sinusów i cosinusów aby ich nie liczyć co chwile tylko podczas zmiany kąta, input, to punkt który jest przeliczany i następnie z niego jest brana współrzędna X,Y która jest rysowana. I to działa. :)
Jak wspomniałem wcześniej, problem jest wyliczenie współrzędnych kursora w 3D.
Robię to w taki sposób:
if (cam.RotateX.Value != 0)
{
input.Y /= cam.RotateX.ValueCosinus;
}
if (cam.RotateY.Value != 0)
{
input.X /= cam.RotateY.ValueCosinus;
}
if (cam.RotateZ.Value != 0)
{
var x10 = input.X * cam.RotateZ.InverseValueCosinus + input.Y * cam.RotateZ.InverseValueSinus;
var y20 = input.X * -cam.RotateZ.InverseValueSinus + input.Y * cam.RotateZ.InverseValueCosinus;
input.X = x10;
input.Y = y20;
}
Ten kod działa, pod warunkiem że nie ma jednoczesnego obrotu w osi X i Y, w przeciwnym wypadku pojawiają się dziwne liczby. Jako dane wejściowe są współrzędne XY kursora z formatki (przez co input.Z = 0). "Inverse" to inaczej wartość kąta w stopniach pomnożona -1.
Czy ktoś mógłby mi podpowiedzieć jak zmienić ten fragment kodu aby wyliczyć poprawnie współrzędne kursora? Spodziewam się że problem jest nieuwzględnienie input.Z ale nie wiem jak to zrobić.
katakrowa