Работать будем с получившимся объектом в предыдущем уроке и будем его упрощать и дорабатывать.
На самом деле, действий не так много придётся совершить =) Благодаря случайности обратил внимание, что у всех объектов разница углов между vecDirection и осью oZ, и vecPlane и осью o Z будет всегда равна 90 градусов. Только у неотзеркаленых она положительная,А у отзеркаленых - отрицательная
Давайте проверим это и добавим два параметра в наш объект:
rAngleZ1, "Угол Z (Direction)", rAngleZ2, "Угол Z (Plane)",
Так же добавим их в функцию MirrorObject:
rAngleZ1 = angleTwoPi(vecDirection,oZ); rAngleZ2 = angleTwoPi(vecPlane,oZ);
и закомментируем наши rAngleX и rAngleY в функции MirrorObject, чтобы не производилось отзеркаливание объекта.
Достаём объект из базы, поворачиваем его всячески и зеркалим, убеждаясь в словах выше:
https://forum.nanocad.ru/uploads/monthly_2021_01/lfpmgHs1nk.mp4.08da3e38ebb5ec8d076856fdcab7fd98.mp4
Видим, что по-мимо углов в 90 и -90 градусов присутствует углы в -270 и 270 градусов соответственно, причина этому то, что когда величина угла достигает 360 градусов она сбрасывается на 0, и получается, что 10-280=-270,но при этом 370-280=90.
Не забываем отразить это в нашем коде.
Для удобства в функции MirrorObject добавим переменную a равную a=rAngleZ1-rAngleZ2
Пишем в функции MirrorObject:
rAngleZ1 = angleTwoPi(vecDirection,oZ); rAngleZ2 = angleTwoPi(vecPlane,oZ); a=rAngleZ1-rAngleZ2; if(a==-90 || a==270) { vecDirection=-vecDirection; }
Теперь наш объект зеркалится обратно, но остаётся проблема с поворотом текста
Для поворота текста будем работать с переменной rAngleY, "Угол Y", поэтому надо её расскомментировать.
Теперь обновляем наши объекты и определяем уже не точные значения, а промежуток, в котором нам надо развернуть текст на 180 градусов.
У меня он получился от 90<rAngleY<=270
Исходя из этого, обновляем нашу функцию следующим образом, тем самым приводя её к итоговому виду
rAngleY = angleTwoPi(oY,vecPlane); rAngleZ1 = angleTwoPi(vecDirection,oZ); rAngleZ2 = angleTwoPi(vecPlane,oZ); a=rAngleZ1-rAngleZ2; sTextAngle=0; if(a==-90 || a==270) { vecDirection=-vecDirection; } if(rAngleY>90 && rAngleY<=270) { sTextAngle=180; }
Обновляем наши объекты и наслаждаемся результатом =)
Как результат наших доработок можно отметить не только более изящный код, но и отсутствие привязок к определенному углу поворота объекта - теперь даже при повороте на условные 37.93 градуса и отзеркаливание, наш объект всё равно корректно отобразит имеющийся текст