Как повернуть 3D-куб в центре XNA?

Я пытаюсь вращать 3D-куб сам по себе от его центра, а не от края. Вот мой код.

public rotatemyCube()
{
    ...
    Matrix newTransform = Matrix.CreateScale(scale) * Matrix.CreateRotationY(rotationLoot) * Matrix.CreateTranslation(translation);
    my3Dcube.Transform = newTransform;
    ....


public void updateRotateCube()
{
    rotationLoot += 0.01f;
}

Мой куб вращается нормально, но не от центра. Вот схема, которая объясняет мою проблему. введите здесь описание изображения

И мне нужно это: введите здесь описание изображения

мой полный код

private void updateMatriceCubeToRotate()
    {
        foreach (List<instancedModel> ListInstance in listStructureInstance)
        {
            foreach (instancedModel instanceLoot in ListInstance)
            {
                if (my3Dcube.IsAloot)
                {

                    Vector3 scale;
                    Quaternion rotation;
                    Vector3 translation;
                    //I get the position, rotation, scale of my cube
                    my3Dcube.Transform.Decompose(out scale,out rotation,out translation);


                    var rotationCenter = new Vector3(0.1f, 0.1f, 0.1f);

                    //Create new transformation with new rotation
                    Matrix transformation =
                        Matrix.CreateTranslation(- rotationCenter)
                        * Matrix.CreateScale(scale)
                        * Matrix.CreateRotationY(rotationLoot)
                        * Matrix.CreateTranslation( translation);

                    my3Dcube.Transform = transformation;


                }
            }
        }
        //Incremente rotation 
        rotationLoot += 0.05f;
    }

person Mehdi Bugnard    schedule 19.02.2013    source источник
comment
Прежде чем применять масштабирование, вращение и перемещение, примените перемещение, центрирующее куб Matrix.CreateTranslation(-h, -h, -h), где h — половина длины стороны куба.   -  person Lucius    schedule 19.02.2013


Ответы (1)


Матрица поворота вращает вершины вокруг начала системы координат. Чтобы вращаться вокруг определенной точки, вы должны сделать ее исходной. Это можно сделать, просто вычитая точку вращения из каждой вершины фигуры.

три рисунка, изображающие вращающийся куб сверху

var rotationCenter = new Vector3(0.5f, 0.5f, 0.5f);

Matrix transformation = Matrix.CreateTranslation(-rotationCenter)
    * Matrix.CreateScale(scaling) 
    * Matrix.CreateRotationY(rotation) 
    * Matrix.CreateTranslation(position);
person Lucius    schedule 19.02.2013
comment
Большое спасибо за вашу ценную помощь! Но теперь мой куб поворачивается и падает. Позиция Y куба уменьшается с каждым проходом цикла. Есть идеи? - person Mehdi Bugnard; 20.02.2013
comment
ок большое спасибо за вашу помощь. Теперь я добавил свой полный код функции в описание. - person Mehdi Bugnard; 20.02.2013
comment
Вы повторно используете перевод (и масштабирование) из предыдущего кадра. Делая это, переводы складываются, и, таким образом, ваш куб перемещается, когда он не должен. Я думаю, что было бы разумнее хранить вращение, масштабирование и перевод в виде векторов, а не в матрице. Было бы намного проще отлаживать, и вы не тратили бы никаких вычислений на разложение матрицы для каждого кадра и куба. - person Lucius; 20.02.2013
comment
Дасс спасибо за все! Ты прав. Спасибо еще раз. Все работает сейчас - person Mehdi Bugnard; 20.02.2013