LINUX.ORG.RU

Вправо/Влево кватернионы

 , , ,


1

2

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

Что нужно: имеем 2 объекта, у первого объекта необходимо установить вправо/влево истиной или ложью в зависимости от того, больше ли его направление относительно второго объекта или меньше.

Примерно так:

Bool left, right;

Object player;
Object target;

var pp = player.global.pos();
var tp = target.global.pos();
var dir = (tp - pp).normalize();

//получаем текущее направление игрока
Quat pq = player.rot.toQuat().normalize();

//получаем направление к необходимому объекту
Quat tq = new Quat.fromVec3(dir);

/*Тут самое главное, нужно сравнить как-то кватернионы, и если
один больше другого, или меньше, установить то или иное
значение булевым переменным. Именно установить значения а не
вращать игрока в направлении объекта, это я знаю как сделать,
нужно именно установить в истину с ложью булевы, в зависимости
от того, больше ли текущее направление по отношению к объекту,
или же меньше*/

/*P.S конструкция вида (pq-tq) невозможна, а из math не знаю
что подходит в моем случае...*/

if (/*pq меньше чем tq*/) {
    left = true;
    right = false;
}

else if (/*pq больше чем tq*/) {
    left = false;
    right = true;
}

else {
    left = false;
    right = false;
}



Последнее исправление: shiva (всего исправлений: 4)

cross-product может быть?

shiva
() автор топика

больше ли его направление относительно второго объекта или меньше.

как это понять?

dikiy ★★☆☆☆
()
Ответ на: комментарий от dikiy

Видимо имеется ввиду прямо ли своим центром смотрит первый на второго, или нет. Но я не уверен что правильно понял.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

прямо ли своим центром смотрит первый на второго, или нет. Но я не уверен что правильно понял.

все верно поняли

shiva
() автор топика

Это старая проблема и к ней есть такой патч, если смотришь со своей точки зрения то право это право, лево это лево, если смотришь с чужой точки зрения то право-лево инвертируются.

torvn77 ★★★★★
()
Ответ на: комментарий от torvn77

Это старая проблема и к ней есть такой

Нет, до проблемы инвертирования я даже не дошел. Объясню конкретно что хочу сделать: есть машина, ее колеса повернуты либо вправо либо по центру либо влево, в зависомости от булевых значений (это важно, вращать мне их не нужно, только булевы менять), так вот, если машина смотрит в направлении сбиваемого объекта, то колеса должны быть по центру (left,right = false), если она смотрит влево от объекта, то right = true и т.д.

shiva
() автор топика
Ответ на: комментарий от shiva
float dot = math.dot(player.pos(), target.pos());
if (dot > 0) {
right = true;
left = false;
}

else if (dot < 0) {
right = false;
left = true;
}

else {
right = false;
left = false;
}

Так тоже хрень получается...

shiva
() автор топика
Ответ на: комментарий от shiva

Как вообще можно определить, смотрит ли вектор относительно данного «вправо» или «влево»? Повернись вокруг направления вектора на 180 градусов и он смотрит в противоположном направлении.

anonymous
()
Ответ на: комментарий от shiva

direction.x первого объекта (игрока) по сравнению с direction.x в направлении второго объекта.

у тебя плоскость что ли? ну так возьми и сравни direction.x

dikiy ★★☆☆☆
()
Ответ на: комментарий от shiva

тебе не скалярное произведение, а векторное надо.

dikiy ★★☆☆☆
()
Ответ на: комментарий от shiva

Чот ты гонишь. Всё не там где тебе думается. Гугли «геометрия поворота колес», там даже есть формулы. Ось поворота, центр вращения авто, а так же углы поворота колес — когда узнаешь, тогда сможешь высчитать траекторию движения и проверять, едет ли машина в препятствие.

deep-purple ★★★★★
()
Ответ на: комментарий от shiva

Тебе тип такого надо?

https://dropmefiles.com/ToLx5 (фпс не кратный, на деле не лагает)

Это на канвасах в браузере, коллизии столкновения не делал, но там не сложно.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

Так работает как мне нужно было:

				var unitDir = transform.look();
				var needDir = new Vec4(tp.x - pp.x, tp.y - pp.y, tp.z - pp.z);
				var unitAngle = Math.atan2(unitDir.y, unitDir.x);
				var needAngle = Math.atan2( needDir.y, needDir.x );

				var diffAngle = needAngle - unitAngle;
				while( diffAngle < -Math.PI )
					diffAngle += Math.PI * 2;
				while( diffAngle > Math.PI )
					diffAngle -= Math.PI * 2;

				//10.0f degree in radians
				if( Math.abs( diffAngle ) > 0.174533 )
				{
					if( diffAngle > 0 )
						left = true;
					else
						right = true;
				}
shiva
() автор топика

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

shiva
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.