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;
}


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

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

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

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

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

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

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

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

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 ()