Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
0 / 0 / 0
Регистрация: 29.06.2021
Сообщений: 20

Поворот объекта вокруг точки с заданной постоянной скоростью

29.06.2021, 23:43. Показов 5820. Ответов 12

Студворк — интернет-сервис помощи студентам
Здраствуйте! Пытаюсь сделать поворот объекта вокруг заданой точки. Поворот должен быть строго 90* (как и вокруг объекта, так и угол поворота самого объекта который поворачивается). Причём, если сейчас объект на начальной точке допустим 0*, нажав первый раз на стрелку вправо объект поворачивается вокруг точки направо, и даже если объект не докрутился к заданой точке (90* относительно точки указаной как ось вращения), а я нажал кнопку влево, то он должен вернуться в позицию 0*. Проблема остановить объект в заданой точке, в которой угол поворота оси будет ровно 90*, и угол поворота самого объекта вокруг его центра 90*. Вот моя реализация (на неё можно и не смотреть):
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public void rotate(float rotateAngel, float direction, float speedRotation)
    {
 
        float to = startAngel + rotateAngel;
 
        print(startAngel + " : " + rotateAngel);
 
        if (coroutine == null)
        {
            coroutine = StartCoroutine(c_Rotate(to, direction, speedRotation));
        }
        else
        {
            coroutine = null;
 
            coroutine = StartCoroutine(c_Rotate(to, direction, speedRotation));
        }
    }
 
    IEnumerator c_Rotate(float to, float direction, float speedRotation)
    {
        while (true)
        {
            transform.RotateAround(new Vector3(0, 0, 0), new Vector3(0, 0, 1), direction * speedRotation * Time.deltaTime);
 
            print("to: " + to + "; selfRotation: " + transform.rotation.z);
 
            if (Quaternion.Euler(0,0, to).z - transform.rotation.z < 0.01f)
            {
                print(to - transform.rotation.z);
 
                coroutine = null;
                transform.rotation = Quaternion.Euler(0,0,to);
 
                yield break;
            }
 
            yield return null;
        }
 
    }
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.06.2021, 23:43
Ответы с готовыми решениями:

Изобразить правильный многоугольник, вращающийся вокруг заданной точки с постоянной угловой скоростью
Ребятки спасайте помогите с задачей нужна срочно срочно на паскале((( вот условие Изобразить на экране правильный многоугольник,...

Поворот вокруг заданной точки
Построить координатную сетку. Нарисовать рисунок из графических примитивов. Используя матрицу смещения, поворота и обратного смещения ...

Поворот фигуры вокруг заданной точки
Не могу найти ни как формулы. Кто знает подскажите пожалуйста. Имеются координаты (x,y), дана точка (i, j), задан угол t. Как...

12
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
30.06.2021, 01:04
А что должно быть если 2 раза вправо нажать?

Если тебе нужны фиксированные повороты ты можешь создать пустышку, под нее кинуть объект и крутить пустышку к заданным углам через quat.lerp.
0
0 / 0 / 0
Регистрация: 29.06.2021
Сообщений: 20
30.06.2021, 02:08  [ТС]
1max1, Два подряд поворота, с недостающим временем для поворота не будет, так что исключаю такой поворот событий. Можно подробней? Просто .RotateAround работает так ка мне нужно. Просто не могу понять, как всё таки докрутить в нужный угол объект. Моя мысль — сделать условие в цикле с поворотом, которое сравнивает нужный угол наклона Объекта с тем, что мы имеем, и недостающую разницу компенсировать после цикла. НО позиция была (5;0), а стала (0.1;-4,9) (к примеру), так как я докрутил угол самого объекта, а не угол вращения объекта вокруг заданной точки
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
30.06.2021, 02:21
Докрутить не проблема)
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using UnityEngine;
using System.Collections;
 
class Test : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
            StartCoroutine(c_RotateAroundPerfect(transform, Vector3.zero, Vector3.forward, 90.0f, 123.0f));
    }
 
    IEnumerator c_RotateAroundPerfect(Transform me, Vector3 point, Vector3 axis, float angle, float speed)
    {
        if (angle < 0.0f)
        {
            axis = -axis;
            angle = -angle;
        }
 
        float t = 0.0f;
 
        while (true)
        {
            float value = speed * Time.deltaTime;
 
            me.RotateAround(point, axis, value);
 
            if ((t += value) > angle)
            {
                me.RotateAround(point, axis, angle - t);
 
                break;
            }
 
            yield return null;
        }
    }
}
Но лучше делать через пустышку, если это допустимо.
0
0 / 0 / 0
Регистрация: 29.06.2021
Сообщений: 20
30.06.2021, 02:42  [ТС]
1max1, спасибо! Пример поможет, но как быть с ситуацией, объект у нас на 90* от точки вращения. Нажимаем кнопку вправо, объекту нужно переместиться на 180*. Он уже на пол пути, 135*. И я нажимаю кнопку влево, Тоесть обратно на 90*. Как достать вот эту разницу? 135* на которые уже вращался, отнять нужные 90* и получить эти 45* на которые нужно повернуться?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
30.06.2021, 13:24
Лучший ответ Сообщение было отмечено DALVROT как решение

Решение

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using UnityEngine;
using System.Collections;
 
class Test : MonoBehaviour
{
    Vector3 point = Vector3.zero;
    Vector3 axis = Vector3.back;
    float angle = 90.0f;
    float sum = 0.0f;
 
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            StopAllCoroutines();
 
            StartCoroutine(c_RotateAroundNext(123.0f));
        }
        else if (Input.GetMouseButtonDown(1))
        {
            StopAllCoroutines();
 
            StartCoroutine(c_RotateAroundPrev(123.0f));
        }
    }
 
    IEnumerator c_RotateAroundPrev(float speed)
    {
        if (sum == 0.0f)
            sum = angle;
 
        while (true)
        {
            float value = speed * Time.deltaTime;
 
            transform.RotateAround(point, -axis, value);
 
            if ((sum -= value) < 0.0f)
            {
                transform.RotateAround(point, -axis, sum);
 
                sum = 0.0f;
 
                break;
            }
 
            yield return null;
        }
    }
 
    IEnumerator c_RotateAroundNext(float speed)
    {
        if (sum == angle)
            sum = 0.0f;
 
        while (true)
        {
            float value = speed * Time.deltaTime;
 
            transform.RotateAround(point, axis, value);
 
            if ((sum += value) > angle)
            {
                transform.RotateAround(point, axis, angle - sum);
                
                sum = angle;
 
                break;
            }
 
            yield return null;
        }
    }
}
1
0 / 0 / 0
Регистрация: 29.06.2021
Сообщений: 20
01.07.2021, 09:52  [ТС]
1max1, Спасибо! Именно то что нужно было. Но координаты объекта странно изменяются. Допустив сделал шаг влево, шаг вправо (Тоесть вернулся на начальную позицию), координаты начальные были (х: 5; y: 0), и стали (x: 5; y: -5). Визуально ничего не изменилось, и если сделать у координату 0, то тоже ничего не меняться. Но странно всё таки, не помешает ли это в дальнейших операциях с этими объектами?

Добавлено через 22 минуты
1max1, Причём каждый раз координаты разные)
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
01.07.2021, 11:39
DALVROT, не понимаю о чем ты, если нажать влево, потом право, все вернется как было. И если ты вращаешь на 90*, то (x: 5; y: -5) недостижимое значение.
0
0 / 0 / 0
Регистрация: 29.06.2021
Сообщений: 20
01.07.2021, 16:38  [ТС]
1max1, Вот (пока не разширил окно, было -8.2695)
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
01.07.2021, 17:52
Ошибка точности float, число приближенное к нулю. Да, не очень хорошо, но от этого не избавиться, так же как и вместо 5 у тебя будет 4.9999
0
0 / 0 / 0
Регистрация: 29.06.2021
Сообщений: 20
01.07.2021, 19:05  [ТС]
1max1, Да я понял, думаю (очень надеюсь), что потом это не помешает. Кстати такой вопрос, раз мне попался очень умный человек, Есть ли у объекта локальные вектора? Что бы при повороте объекта вокруг своей оси, направление его движения не менялось? Или прийдется делать костыли со сменой направления вектора движения?

Добавлено через 27 минут
1max1, Разобрался с локальными векторами, оказалось всё намного проще (transform.right), если платформа расположена горизонтально, при
C#
1
rigidBody.velocity = transform.right * -1 * speed * Time.deltaTime;
она движется налево, при повороте на 90* платформы, она вообще не двигаеться, поворот ещё на 90*, когда платформа опять в горизонтальном положении и она опять движеться (в другую сторону, так как была перевёрнута на 180*, тоесть всё правильно работает). Здесь можно что-нибудь сделать? Или нужно переходить на transform.up?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
01.07.2021, 19:12
Если не движется значит что-то мешает. Может ты зафиксировал позицию в Rigidbody Constraints? Или другой скрипт на это влияет или коллайдер, много причин...
0
0 / 0 / 0
Регистрация: 29.06.2021
Сообщений: 20
01.07.2021, 19:31  [ТС]
1max1, Именно так... Забыл что заблокировал. Случайно наткнулся на тему где ты отвечал на такой же вопрос, и решил покопаться. Спасибо огромное!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.07.2021, 19:31
Помогаю со студенческими работами здесь

Переделать грибок на снеговика(поворот вокруг заданной точки)
uses graphabc,crt; const center=windowwidth div 2; p=10; var ygol,d,xt,yt,th,tn,ox5,ox6,ox7,ox8,oy5,oy6,oy7,oy8,ox9,oy9,ox10,oy10,...

Поворот объекта относительно заданной точки OpenGL ES 2.0
Здравствуйте! У меня есть прямоугольник 100 на 50, который я хочу повернуть относительно точки, к примеру, (20, 10), но у меня никак не...

Изобразить равнобедренный треугольник, вращающийся с постоянной угловой скоростью вокруг своей высоты
Изобразить равнобедренный треугольник, вращающийся с постоянной угловой скоростью вокруг своей высоты, расположенной параллельно...

Изобразить равнобедренный треугольник, вращающийся с постоянной угловой скоростью вокруг своей высоты
Изобразить равнобедренный треугольник, вращающийся с постоянной угловой скоростью вокруг своей высоты, расположенной параллельно...

Поворот объекта относительно заданной точки на заданный угол
напишите программу,которая осуществляет поворот объекта относительно заданной точки на заданный угол,а затем осуществляет отображение...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru