Здравствуйте!
Подскажите пожалуйста.
У меня такая проблемма
Приложение на управляемом DirectX
рисует в пространстве движение сферы вокруг центра координат в мировых координатах
также рисую три оси координат на них координатные точки (-2, -1, 0, 1, 2 ,3 ,4 , 5 и т.д.)
при помощи CustomVertex.PositionColored
к точкам рисую подписи (-2, -1, 0, 1, 2 ,3 ,4 , 5 и т.д.)
при помощи массива Test2DText = new Vector3[NumberItemsPoint];
далее стартует поток который меняет координаты и сфера движеться
есть управление параметрами отображения сцены во время работы потока
изменение дистанции
и трех углов
OptimizedWorldMatrix = Matrix.Identity;
OptimizedWorldMatrix = Matrix.Multiply(OptimizedWorldMatrix,Matrix.RotationX(Geometry.DegreeToRadian((float)theta)));
OptimizedWorldMatrix = Matrix.Multiply(OptimizedWorldMatrix,Matrix.RotationY(Geometry.DegreeToRadian((float)phi)));
OptimizedWorldMatrix = Matrix.Multiply(OptimizedWorldMatrix,Matrix.RotationZ(Geometry.DegreeToRadian((float)psi)));
далее расчитываються экранные координаты для отображения подписей координат с помощью
Font2D.DrawText(null, text, new Rectangle(x, y, this.Width, this.Height), DrawTextFormat.NoClip|DrawTextFormat.ExpandTabs|DrawTextFormat.WordBreak, c);
суть проблеммы в том что при создании окна координаты расчитаны точно и каждая подпись находиться около нужной точки
при изменении одного угла эти экранные координаты подписей пересчитываються правильно
но при изменении двух других углов экранные координаты подписей вращаються в обратном направлении
Метод расчета экранных координат таков
берутся координаты точек и копируються в массив Test2DText
vertsPoint[0].X = TempFactor;
vertsPoint[0].Y = 0.0f;
vertsPoint[0].Z = 0.0f;
vertsPoint[0].Color = Color.White.ToArgb();
...
...
vertsPoint[2].X = 2.0f*TempFactor;
vertsPoint[2].Y = 0.0f;
vertsPoint[2].Z = 0.0f;
vertsPoint[2].Color = Color.White.ToArgb();
...
...
vertsPoint[29].X = 0.0f;
vertsPoint[29].Y = 0.0f;
vertsPoint[29].Z = -5.0f*TempFactor;
vertsPoint[29].Color = Color.White.ToArgb();
vbPoint.SetData(vertsPoint, 0, LockFlags.None);
for (int i = 0; i < 30; i++)
{
Test2DText[i] = vertsPoint[i].Position;
}
далее при изменении углов пересчитываються матрицы
и пересчитываються экранные координаты подписей точек из координат точек
при помощи метода Vector3.TransformCoordinate
TestMatrix = Matrix.Identity;
TestMatrix = Matrix.Multiply(TestMatrix,WorldMatrix);
TestMatrix = Matrix.Multiply(TestMatrix,ViewMatrix);
TestMatrix = Matrix.Multiply(TestMatrix,ProjFov);
for (int i = 0; i < 30; i++)
{
Vector3 TestVector3 = Vector3.TransformCoordinate(Test2DText[i],TestMatrix);
TestVector3.X = TestVector3.X * this.ClientSize.Width/2;
TestVector3.Y = TestVector3.Y * this.ClientSize.Height/2;
TestVector3.X = TestVector3.X + this.ClientSize.Width/2;
TestVector3.Y = TestVector3.Y + this.ClientSize.Height/2;
if (i < 10)
{
Draw2DText(""+Test2DText[i].X, (int)TestVector3.X, (int)TestVector3.Y, Color.White);
}
else
{
if (i < 20)
{
Draw2DText(""+Test2DText[i].Y, (int)TestVector3.X, (int)TestVector3.Y, Color.White);
}
else
{
Draw2DText(""+Test2DText[i].Z, (int)TestVector3.X, (int)TestVector3.Y, Color.White);
}
}
}
Подскажите пожалуйста что я делаю не так
как это можно исправить?