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

Как сделать правдоподобный поворот шарика?

23.05.2019, 12:06. Показов 4198. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Шарик двигается по поверхности вперед с определенной скоростью и при этом вращается.
Хочу сделать вращение шарика правдоподобным, чтобы при увеличении скорости увеличивалась и скорость вращения.

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Mover : MonoBehaviour {
    public float speed;
 
    private Rigidbody rb;
 
    // дистанция, которую пройдет шарик за один полный оборот. l = 2 * PI * r
    private float length;
    // Start is called before the first frame update
    private void Start () {
        rb = GetComponent<Rigidbody> ();
        length = GetComponent<SphereCollider> ().radius * 2 * 3.14f;
    }
 
    private void FixedUpdate () {
        // дистанция, которую прошел шарик
        float move = speed * Time.deltaTime;
        // на сколько градусов нужно повернуть шарик
        float angle = (move / length) * 360;
        rb.velocity = new Vector3 (rb.velocity.x, rb.velocity.y, move);
        transform.Rotate (angle, transform.rotation.y, transform.rotation.z, Space.Self);
    }
}
При этом шарик вращается дико быстро. Не понимаю почему.
https://www.youtube.com/watch?... e=youtu.be
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.05.2019, 12:06
Ответы с готовыми решениями:

Движение шарика вдоль прямоугольника,(по касательной) по часовой стрелке.не могу написать поворот по ребру
Движение шарика вдоль прямоугольника,(по касательной) по часовой стрелке.не могу написать поворот по ребру

Не могу сделать поворот матрицы на каждое нажатие, и её нормальный поворот
var Form1: TForm1; m, n: integer; i, j: byte; b, a: array of integer; implementation uses Unit2, Unit3;

Как сделать два двигающихся шарика
Как сделать в &quot;pascalABC&quot; два двигающихся шарика? помогите, пожалуйста

13
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
23.05.2019, 12:27
Углы, вообще-то, в радианах считаются, а не в градусах.
1
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
23.05.2019, 12:27
Сделай движение через angularVelocity + физ. материал с большой силой трения. Правдоподобней некуда будет.
C#
1
transform.Rotate (angle, transform.rotation.y, transform.rotation.z, Space.Self);
Это вообще что-то неадекватное...
0
0 / 0 / 2
Регистрация: 26.01.2016
Сообщений: 81
23.05.2019, 12:59  [ТС]
Цитата Сообщение от 1max1 Посмотреть сообщение
Сделай движение через angularVelocity + физ. материал с большой силой трения. Правдоподобней некуда будет.
C#
1
transform.Rotate (angle, transform.rotation.y, transform.rotation.z, Space.Self);
Это вообще что-то неадекватное...
В трении нет необходимости, поскольку шарик двигается бесконечно вперед.
А можно подробнее, что там неадекватного?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
23.05.2019, 13:17
Цитата Сообщение от WhatIsHTML Посмотреть сообщение
А можно подробнее, что там неадекватного?
Всё))
C#
1
2
3
// дистанция, которую прошел шарик (а вот и нет)
float move = speed * Time.deltaTime;
// Дистанция, которую прошел шарик - это разница между позицией в предыдущем кадре, и текущем.
C#
1
2
// на сколько градусов нужно повернуть шарик (а вот и нет, аз-за ошибки предыдущего)
float angle = (move / length) * 360;
C#
1
2
3
4
5
6
7
8
transform.Rotate (angle, transform.rotation.y, transform.rotation.z, Space.Self);
// даже не знаю как сказать... Это все равно что написать:
transform.position = new Vector3(transform.rotation.y, transform.eulerAngles.z, transform.localScale.x);
// в общем бред несусветный...
// transform.Rotate - метод, который поворачивает объект по определенным осям на определенные значения
// transform.rotation - это вообще кватернион, то есть тут даже не градусы и не радианы.
// Если нужен поворот только по оси Х, тогда нужно было написать так:
transform.Rotate(angle, 0, 0);
Добавлено через 2 минуты
Цитата Сообщение от WhatIsHTML Посмотреть сообщение
В трении нет необходимости, поскольку шарик двигается бесконечно вперед.
Трение нужно для того, чтобы он не прокручивался на месте, вовремя добавления крутящего момента.
0
0 / 0 / 2
Регистрация: 26.01.2016
Сообщений: 81
23.05.2019, 13:28  [ТС]
Если по Rotate вопросов нет, то тут не соглашусь
C#
1
2
3
// дистанция, которую прошел шарик (а вот и нет)
float move = speed * Time.deltaTime;
// Дистанция, которую прошел шарик - это разница между позицией в предыдущем кадре, и текущем.
speed - это скорость условных метров в секунду. Поэтому move - это дистанция, которую пройдет шарик. (ок ошибся, не "прошел", а "пройдет", но ничего это не меняет в данном случае).
Зачем сохранять предыдущее положение шарика в отдельной переменной, если мы и так знаем величину move - на которую шарик сдвинется вперед?
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
23.05.2019, 14:16
Цитата Сообщение от WhatIsHTML Посмотреть сообщение
Поэтому move - это дистанция, которую пройдет шарик.
А если врежется в столб что тогда? Величина осталось, а дистанция уже не будет пройдена. Так же, если шарик прыгнет вверх (может у тебя он и не прыгает, но чисто теоретически), уже совсем другая дистанция. Корректней было бы определять именно через разницу положений. Но смотри сам, может тебе и не нужна такая точность. Лично я бы сделал через крутящий момент.
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
23.05.2019, 14:44
C#
1
float angle = (move / length) * 360;
--------->
C#
1
float angle = (move / length) * 2f * Mathf.PI;
C#
1
transform.Rotate (angle, transform.rotation.y, transform.rotation.z, Space.Self);
--------->
C#
1
2
transform.Rotate (Vector3.right, angle, Space.Self);
//transform.Rotate (Vector3.up, angle, Space.World);
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
23.05.2019, 15:06
Не изобретайте велосипед:
https://www.youtube.com/watch?... e=youtu.be

Добавлено через 19 минут
Цитата Сообщение от Cr0c Посмотреть сообщение
float angle = (move / length) * 2f * Mathf.PI;
Вообще-то Rotate принимает аргументы в градусах, а не радианах...
1
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
23.05.2019, 15:27
1max1, ну значит"Акелла промахнулся" )) привык к синусам/косинусам...
0
0 / 0 / 2
Регистрация: 26.01.2016
Сообщений: 81
27.05.2019, 13:13  [ТС]
Каким образом можно достичь подобного для AI с NavMeshAgent? Не нашел, чтобы кто-то делал что-то подобное
Пример
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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
 
public class EnemyAI : MonoBehaviour {
    private NavMeshAgent navMesh;
    private Rigidbody rb;
 
    void Start () {
        navMesh = GetComponent<NavMeshAgent> ();
        Vector3 target = GameObject.FindWithTag ("Finish").transform.position;
        navMesh.SetDestination (target);
        rb = GetComponent<Rigidbody> ();
    }
 
    private void FixedUpdate () {
        // вращение вокруг неправильной оси
        rb.angularVelocity = new Vector3 (rb.velocity.x, rb.velocity.y, rb.velocity.z);
 
        // вращения нет совсем
        // rb.angularVelocity = new Vector3 (rb.velocity.y, rb.velocity.z, rb.velocity.x);
    }
}
Результат на видео. Игрок - зеленый шар и вращается нормально. Красный - ИИ и как видно, вращается неадекватно.
Не пойму что не так.
https://youtu.be/NyI2rIcQHJI
Даже если в тупую задать
C#
1
rb.angularVelocity = new Vector3 (10, 0, 0);
То вращаться вперед он не станет.
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
27.05.2019, 13:18
WhatIsHTML, берешь navMesh.speed, поворачиваешь на 90° и используешь как ось поворота (длина navMesh.speed - это угол поворота в секунду)
0
0 / 0 / 2
Регистрация: 26.01.2016
Сообщений: 81
27.05.2019, 13:28  [ТС]
Не совсем понял чем это принципиально отличается от того, что я написал.
C#
1
2
        rb.angularVelocity = new Vector3 (1, 1, 1); // никакого эффекта
        rb.AddTorque (new Vector3 (1, 1, 1)); // то же самое
Забыл упомянуть, что к шарикам прикреплен материал, благодаря которому собственно и движется зеленый.
Тот же материал и у красного. Думал, может в нем причина, но отключение материала не дает ровным счетом никакого эффекта
Миниатюры
Как сделать правдоподобный поворот шарика?   Как сделать правдоподобный поворот шарика?  
0
 Аватар для 1max1
3362 / 1775 / 1028
Регистрация: 26.10.2018
Сообщений: 5,204
27.05.2019, 13:36
Если не ошибаюсь, то примерно так:
C#
1
rb.angularVelocity = Vector3.Cross(navMesh.velocity, Vector3.up);
Возможно надо еще нормализовать и домножить на какую-то величину, лень думать))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.05.2019, 13:36
Помогаю со студенческими работами здесь

Как сделать поворот по одной оси?
Есть 2д игра,вид сверху,и спрайты расположены вот так. Нужно чтобы монстр смотрел на игрока и шёл на него,однако с первой частью...

Как сделать плавный поворот башни
Всем привет! Вообщем, я хотел создать плавный поворот башни танка за мышью, написал немного кода Угол в радианах var A =...

Как сделать поворот машины кнопами?
Всем привет, воспользовался стандартным ассетом и получил рабочею машину с мобильным управлением но управление мне не понравилось, во...

Как сделать поворот башни мышкой?(юнити 2д)
Представим танк с видом сверху 2д, например, я навожу куда-нибудь мышь и ствол должен повернуться туда же. Вот основа кода using...

Как сделать поворот картинки по нажатию кнопок на определённый градус?
доброго время суток как в java сделать поворот картинки по нажатию кнопок на определённыи градус


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru