Досега успях да създам Quaternion
за ротация. Единственият проблем сега е как да го приложа само към определени кубчета? Както когато натисна десния клавиш на клавиатурата в момента, всяко кубче се върти непрекъснато около началото.
За справка имам 8 кубчета, разположени в настройка, подобна на тази на кубчето на Рубик (2x2x2). Така че, когато натисна стрелката надясно/наляво, дясната/лявата страна на „Куба“ (голям куб, съставен от 8 по-малки кубчета), се завърта на 90 градуса по часовниковата стрелка/обратно на часовниковата стрелка.
Пример за една от декларациите на Cubes (от общо осем куба):
GameObject subCube3 = new GameObject();
Vector3 subCube3Pos = new Vector3(-0.55f, -0.55f, 0.55f);
В моя метод за актуализиране:
// declare rotation floats
float updownRotation = 0.0f;
float leftrightRot = 0.0f;
// get state of keyboard
KeyboardState keys = Keyboard.GetState();
// if key is pressed, change value of rotation
if (keys.IsKeyDown(Keys.Right))
{
leftrightRot = -0.10f;
}
// if key is pressed, change value of rotation
if (keys.IsKeyDown(Keys.Left))
{
leftrightRot = 0.1f;
}
// if key is pressed, change value of rotation
if (keys.IsKeyDown(Keys.Up))
{
updownRotation = 0.1f;
}
// rotation around axis
Quaternion addRot = Quaternion.CreateFromAxisAngle(new Vector3(1.0f, 0.0f, 0.0f), leftrightRot);
//rotation of cubes
cubeRotation = cubeRotation * addRot;
Моята функция за рисуване:
void DrawGameObject(GameObject gameobject)
{
//graphics.GraphicsDevice.RenderState.CullMode = CullMode.None;
foreach (ModelMesh mesh in gameobject.model.Meshes)
{
foreach (BasicEffect effect in mesh.Effects)
{
effect.EnableDefaultLighting();
effect.PreferPerPixelLighting = true;
effect.World =
Matrix.CreateScale(gameobject.scale) *
Matrix.CreateFromQuaternion(cubeRotation) *
Matrix.CreateTranslation(gameobject.position);
effect.Projection = cameraProjectionMatrix;
effect.View = cameraViewMatrix;
}
mesh.Draw();
}
}
Това, което според мен е проблемът, е, че Matrix.CreateTranslation(gameobject.position)
очевидно засяга всичките ми кубчета. Опитах се да създам нов Vector3
т.е.: c_component1 = Vector3.Transform(cube1pos, cubeRotation);
, но дори и тогава не съм сигурен къде да го поставя и действително да го използвам.
Някой има ли идеи? Всяка помощ ще бъде високо оценена.