Войти
ПрограммированиеФорумОбщее

(Решено)Запуск Луча от объекта под определенным углом в Unity3d

Страницы: 1 2 Следующая »
#0
(Правка: 1:11) 1:09, 13 окт. 2020

Всем привет, нужна помощь.

Мне необходимо направить луч от ГО не просто в направлении forward или right и т.д., а под определенным углом (например 45 градусов).

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

Причем forward работает правильно кстати, а мой вариант нет.

На тесте использую дебаг, но с Ray будет аналогия соответственно.

Debug.DrawRay(gameObject.transform.position, new Vector3(gameObject.transform.position.x + 15.0f,                         gameObject.transform.position.y, gameObject.transform.position.z + 15.0f), 
Color.green, 0.0f, false);

Подскажите пожалуйста, как это сделать, не нашел нигде именно такого момента.


#1
8:32, 13 окт. 2020

GriMorProgram
Я так понял, повороты только вправо-влево? Тогда просто умножай вектор forward на MatrixRotationY(angle).

#2
11:06, 13 окт. 2020

Mikle
Хм, протестирую сегодня, а как тогда длину настроить?

При обычном форварде мы умножаем на 30 например, и луч у нас рисуется длиной 30 у.е.

#3
11:30, 13 окт. 2020

GriMorProgram
При умножении вектора forward на MatrixRotationY(angle) он останется той же единичной длины, только повернётся в нужную сторону. Полученный вектор умножай на 30 или на сколько надо.

#4
11:45, 13 окт. 2020

Mikle
Понял, спасибо большое, попробую сегодня.

#5
0:29, 14 окт. 2020

Mikle

в общем испробовал я этот прием, но ничего не произошло, выдает ошибку:
The name 'MatrixRotationY' does not exist in the current context

быть может нужно библиотеку подключить какую?

у меня только эти:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

Debug.DrawRay(gameObject.transform.position, gameObject.transform.forward * MatrixRotationY(45) * 15.0f, Color.green, 0.0f, false);
#6
0:38, 14 окт. 2020

Mikle
в общем нашел библиотеку, но все тоже самое...

видимо проблема в другом.

осталось понять в чем?

#7
0:58, 14 окт. 2020

GriMorProgram
прицепи гамеобджект который будет под нужным углом
А далее или в его форвард или как там у тебя

#8
11:48, 14 окт. 2020

endeavour_pr
Этот вариант мне не подходит, мне надо что бы все было через класс.

Тот кто будет собирать сцену, должен просто прикрепить скрипт к го и настроить минимальное количество настроек.

Но спасибо за подсказку))

#9
11:50, 14 окт. 2020

GriMorProgram
> все тоже самое...
Что то же самое? Ошибка "The name 'MatrixRotationY' does not exist in the current context"?

#10
13:09, 14 окт. 2020

Так, вроде разобрали, платформа Unity3d, там функция по другому прописывается.

Найду, напишу что получилось

#11
1:59, 18 окт. 2020

Так, в общем пытался найти аналог Matrix.Rotate(angle), но ничего не нашел, кроме Matrix4x4.Rotate, но он является вектором, и выдает ошибку при использовании.

Вопрос все еще актуален, как запустить луч в Unity3d под нужным углом из кода???
очень нужна помощь, заранее спасибо.

#12
(Правка: 20 окт. 2020, 1:56) 2:47, 18 окт. 2020

GriMorProgram
> ничего не нашел, кроме Matrix4x4.Rotate, но он является вектором

Вообще-то матрицей 4x4.

С мировыми векторами:

Quaternion rotation = Quaternion.AngleAxis(45, Vector3.up); // вращение на 45 градусов вокруг оси, заданной вектором «вверх»
Vector3 direction = rotation * Vector3.forward; // прикладываем к исходному вектору «вперёд» вращение, заданное кватернионом
Vector3 origin = Vector3.zero;
Ray ray = new Ray(origin, direction);

С векторами объекта:

Quaternion rotation = Quaternion.AngleAxis(45, transform.up);
Vector3 direction = rotation * transform.forward;
Vector3 origin = transform.position;
Ray ray = new Ray(origin, direction);

#13
9:33, 18 окт. 2020

Лично меня не пугают костыли , мусор в коде и на сцене.
Если мне единично нужны какие-то направления, то у меня на сцене всегда есть объект(который я называю Helper и храню в статичной переменной), который я ставлю в исходную точку, разворачиваю куда надо при помощи LookAt() и уже использую его forward или, если надо, его локальное пространство.

#14
(Правка: 14:49) 14:48, 18 окт. 2020

GriMorProgram
Если у тебя нет наклонов, то есть вектор forward всегда горизонтален, тогда можно повернуть его вообще просто:

vector v;
float s = sin(angle), c = cos(angle);
v.y = 0;
v.x = forward.x * c + forward.z * s;
v.z = forward.z * c - forward.x * s;
Всё, в векторе v повёрнутый вектор forward. Только плюс и минус в последних двух строках могут поменяться местами - это зависит от того, правая или левая там система координат.
Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее