Перейти к содержанию
  • записей
    6
  • комментариев
    7
  • просмотра
    203

Отзеркаливание текста в параметрическом объекте (модуль СПДС)

dromandon

145 просмотров

Небольшая статейка о том, как сделать, чтобы при отзеркаливание параметрического объекта СПДС не зеркалился текст прописаный в геометрии объекта (UText)
Ответ прост - никак :D

Даже если вы создадите для объекта вид сзади, который будет зеркален виду спереди, текст в геометрии себя будет вести неадекватно

Спойлер

MTEvOQA2R8.gif.68f408b1dec328edf836e0ec9e5b7957.gif.a4092fee4615478628e2fdad6887cc4f.gif

 

Тогда что же делать?
Во-первых, мы не будем создавать вид сзади. Мы заставим объект отзеркалиться обратно!
Что нам для этого надо:
1. Заставить объект понимать, что он отзеркален.
2. Заставить объект, если он отзеркален, зеркалить себя обратно.

3. Заставить объект переместить себя на нужное место.
 

Решаем первую задачу

Мой объект -  Пример для отзеркаливания текста (пустышка).mcd

Вводим две переменные в объект:
rAngleX (назовём её "Угол X") и rAngleY (назовём её "Угол Y")

для переменной "Угол X" вычисляем угол между глобальной осью oY и вектором нашего объекта vecDirection

rAngleX = angleTwoPi(oY,vecDirection);

Для "Угол Y" вычисляем угол между осью oY и вектором нашего объекта vecPlane

rAngleY = angleTwoPi(oY,vecPlane);

 

Создаём функцию MirrorObject вначале нашего кода и прописываем там наши формулы

 

function MirrorObject
{
	rAngleX = angleTwoPi(oY,vecDirection);
	rAngleY = angleTwoPi(oY,vecPlane);
}

 

Прописываем нашу функцию в функциях OnInitialization, чтобы инициализировать  при вставке объекта наши переменные, и в OnMakeParameters, что при обновление объекта с помощью команды SPREGENSTD наши параметры обновились (на видео я запускаю эту команду через кнопку)
 

Спойлер

 

Из видео видно, что если мы зеркалим объект по оси Y то
Угол X = 90

Угол Y = 0

 

А если по X, то

Угол X = 270

Угол Y = 180

 

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

 

Тут всё просто, на самом деле)

Прописываем iff'ы, которые при определённых значения rAngleX и rAngleY будут разворачивать наш объект

И загоняем их в нашу функцию  MirrorObject

Рассмотрим момент, когда мы зеркалим по оси Y.

Что происходит в этот  момент с объектом?
У него меняется направления вектора vecDirection. Значит, чтобы отзеркалить объект обратно, нам надо для начала поменять направления вектора vecDirection!
пишем:

if(rAngleX==90 && rAngleY==0)
{
	vecDirection = -vecDirection;
}

А при зеркале по оси X меняется направление vecPlane, как следствие:

 

if(rAngleX==270 && rAngleY==180)
{
	vecPlane= -vecPlane;
}

 

Загоняем это в нашу функцию

function MirrorObject
{
	rAngleX = angleTwoPi(oY,vecDirection);
	rAngleY = angleTwoPi(oY,vecPlane);
	if(rAngleX==90 && rAngleY==0)
	{
		vecDirection = -vecDirection;
	}
	if(rAngleX==270 && rAngleY==180)
	{
		vecPlane= -vecPlane;
	}
}

Сохраняем объект и обновляем его на чертеже
 

Спойлер

 

О чудо, всё заработало!)

Но ещё рано радоваться, проверяем разные случаи и получаем:

Спойлер

 

Логика та же, что и раньше, дописываем iff'ы исходя из угла)

 

function MirrorObject
{
	rAngleY = angleTwoPi(oY,vecPlane);
	rAngleX = angleTwoPi(oY,vecDirection);
	if(rAngleX==90 && rAngleY==0)
	{
		vecDirection=-vecDirection;
	}
	if(rAngleX==270 && rAngleY==180)
	{
		vecPlane=-vecPlane;
	}
	if(rAngleX==0 && rAngleY==270)
	{
		vecDirection=-vecDirection;
	}
	if(rAngleX==180 && rAngleY==90)
	{
		vecPlane=-vecPlane;
	}
}

Запись специально не упрощал, но вы можете, если хотите,  объединить через "или" (||) часть кода)

Проверяем результат:

Спойлер


Текст не зеркалится, но крутится.

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

В ActHeader в Public дописываем переменную 

sTextAngle, "hidden" 

я её скрыл, потому что вручную менять не планирую, если хотите, можете оставить открытой.

А коде исполнения UText дополняем переменной нашего угла:
 

UText(mp, DegToRad(sTextAngle), 2.5*rSymScl/rScl, 0, 0.0000, T, 1,1);

Я буду работать с углом в градусах

 

Далее мы определяем в каких значения Угла X и Угла Y у нас текст повёрнут и выставляем для этого случая нужное нам значение sTextAngle, тем самым формирую итоговый вид нашей функции:
 

function MirrorObject
{
	rAngleY = angleTwoPi(oY,vecPlane);
	rAngleX = angleTwoPi(oY,vecDirection);
	if(rAngleX==90 && rAngleY==0)
	{
		vecDirection=-vecDirection;
	}
	if(rAngleX==270 && rAngleY==180)
	{
		vecPlane=-vecPlane;
	}
	if(rAngleX==0 && rAngleY==270)
	{
		vecDirection=-vecDirection;
	}
	if(rAngleX==180 && rAngleY==90)
	{
		vecPlane=-vecPlane;
	}
	
	if(rAngleY==180 || rAngleY==270)
	{
		sTextAngle=180;
	}
	else
	{
		sTextAngle=0;
	}
}

Сохраняем и обновляем наши объекты:

Спойлер

 

Собственно на  этом и всё) 
Третий пункт нашей задачи нам не понадобился, так как точка вставки объекта находится по его центру.
Если же точка вставки объекта находилась у края объекта, то нам пришлось бы кроме отзеркаливания объекта обратно в коде, прописывать дополнительно смещения объекта.
Проведу часть такого кода из своего другого объекта, чтобы было понятна логика действия:
 

anY = angleTwoPi(oY,vecPlane);
anX = angleTwoPi(oY,vecDirection);
pnt1x = pntOrigin:x;
pnt1y = pntOrigin:y;
if (anX==180 && anY==90)
{
	pntOrigin:x = pnt1x - L;
	vecPlane=-vecPlane;
}
if (anX==90 && anY==0)
{
	pntOrigin:x = pnt1x - B;
	vecDirection=-vecDirection;
}

Примеры моих объектов, с применение данной логики для отзеркаливания:

Спойлер
Спойлер

 



3 Комментария


Рекомендуемые комментарии

Гость
Добавить комментарий...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

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

Загрузка...
×
×
  • Создать...