Форум программистов, компьютерный форум, киберфорум
Наши страницы
XNA/MonoGame
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
makedonsky94
45 / 45 / 4
Регистрация: 14.02.2013
Сообщений: 139
1

Поворот объекта

02.04.2014, 14:03. Просмотров 765. Ответов 2
Метки нет (Все метки)

В общем необходимо сделать вращающийся объект, состоящий из n количества квадратов
Сделал класс квадрата
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Block
    {
        public Block(Texture2D mainTexture, Vector2 vector)
        {
            this.mainTexture = mainTexture;
            this.mainVector = vector;
        }
 
        Texture2D mainTexture;
        public float Rotate = 0;
        public Vector2 mainVector;
 
        public void Draw(SpriteBatch spriteBatch)
        {
            spriteBatch.Draw(mainTexture, new Rectangle((int)mainVector.X, (int)mainVector.Y, 20, 20), new Rectangle(0,0,20,20), Color.White, Rotate, new Vector2(10, 10), 0, 0);
        }
    }
Далее создаю квадраты
C#
1
2
3
4
5
6
7
8
9
10
 protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            block = Content.Load<Texture2D>("block");
            mainBlocks = new Block[5];
            for (int i = 0; i < mainBlocks.Length; i++)
            {
                mainBlocks[i] = new Block(block, new Vector2(100, 100 + 20 * i));
            }
        }
Просмотрел формулы кинематики, нашел то , что нужно
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
double w;
        double T = 2;
        protected override void Update(GameTime gameTime)
        {
            w = 2 * Math.PI / T;
            mainBlocks[0].Rotate += 0.0521f;
            mainBlocks[1].Rotate += 0.0521f;
            mainBlocks[2].Rotate += 0.0521f;
            mainBlocks[3].Rotate += 0.0521f;
            mainBlocks[4].Rotate += 0.0521f;
            mainBlocks[0].mainVector.X += (float)(5 * Math.Cos(w * gameTime.TotalGameTime.TotalSeconds));
            mainBlocks[0].mainVector.Y += (float)(5 * Math.Sin(w * gameTime.TotalGameTime.TotalSeconds));
            mainBlocks[1].mainVector.X += (float)(4 * Math.Cos(w * gameTime.TotalGameTime.TotalSeconds));
            mainBlocks[1].mainVector.Y += (float)(4 * Math.Sin(w * gameTime.TotalGameTime.TotalSeconds));
            mainBlocks[2].mainVector.X += (float)(3 * Math.Cos(w * gameTime.TotalGameTime.TotalSeconds));
            mainBlocks[2].mainVector.Y += (float)(3 * Math.Sin(w * gameTime.TotalGameTime.TotalSeconds));
            mainBlocks[3].mainVector.X += (float)(2 * Math.Cos(w * gameTime.TotalGameTime.TotalSeconds));
            mainBlocks[3].mainVector.Y += (float)(2 * Math.Sin(w * gameTime.TotalGameTime.TotalSeconds));
            mainBlocks[4].mainVector.X += (float)(1 * Math.Cos(w * gameTime.TotalGameTime.TotalSeconds));
            mainBlocks[4].mainVector.Y += (float)(1 * Math.Sin(w * gameTime.TotalGameTime.TotalSeconds));
            if (Keyboard.GetState().IsKeyDown(Keys.Escape))
                this.Exit();
            base.Update(gameTime);
        }
Вроде все отлично, за исключением угла поворота. Как просчитать его? Пока набрал только на глаз
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2014, 14:03
Ответы с готовыми решениями:

Организация вращения объекта вокруг уже вращающегося объекта
Собственно необходимо организовать движение вокруг уже движущегося объекта. XNA изучаю недавно,...

Поворот и движение
1. spriteBatch.Begin(); spriteBatch.Draw(panzerDummy, panzerDummyVector,...

Поворот 3D модели
Всем привет! Столкнулся с проблемой при повороте 3д модели. Пробую повернуть с помощью вот такого...

Поворот фигуры на 90 градусов
Нужно чтобы при нажатии клавиши вправо или влево фигура поварачивалась на 90 градусов и двигалась...

Поворот изображения XNA
Мне нужно повернуть изображение в XNA но повернуть его нужно корректно, дело в том что поворот идет...

2
za5
443 / 347 / 32
Регистрация: 16.10.2010
Сообщений: 842
Записей в блоге: 7
02.04.2014, 15:19 2
Не проверял на правильность и не уверен, что понял вопрос (несколько вращений тоже должны сработать - надо добавить origin2 и угол2):
C#
1
2
Matrix matrix = Matrix.CreateTranslation(-origin1) * Matrix.CreateRotationZ(угол1) * Matrix.CreateTranslation(origin1) * Matrix.CreateScale(1,1,0);
spriteBatch.Begin(SpriteSortMode.Immediate, null, null, null, null, null, matrix);
Добавлено через 7 минут
Хотя способ не очень, я бы написал простой эффект или использовал BasicEffect, потом менял матрицы мира.
0
makedonsky94
45 / 45 / 4
Регистрация: 14.02.2013
Сообщений: 139
02.04.2014, 16:28  [ТС] 3
Использование матриц мне не очень подходит, так как помимо этих блоков будут присутствовать и другие, не движущиеся, которые не получится вынести в другой spritebatch
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2014, 16:28

Поворот/Масштабирование BoundingBox'a
При построении BoundingBox'a я использую минимальные и максимальные координаты модели... я могу...

Поворот изображения: исправить код
Помогите пожалуйста с поворотом изображения, вот код: Texture2D rv; Rectangle rrv; ...

Поворот объекта относительно другого объекта 2D
Делаю игру с видом сверху и нужно чтобы стрела от лучника вылетала перьями (будем считать, что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.