Общие операции
Обобщение
Эта страница содержит список наиболее употребляемых оперций над 3D моделью. Эта страница просто быстрый обзор, детальная документация по этим операциям изложена в этом мануале позже.
Быстрый обзор операций.
Две наиболее употребляемые операции это смена положения и ориентации.
myNodePath.setPos(X,Y,Z)
По-умолчанию в Panda3D ось X направлена вправо, ось Y — вперед, а ось Z вверх. Вращение объекта обычно описывается с помощью углов Эйлера называемых Heading, Pitch и Roll (иногда называемых Yaw, Pitch и Roll в других пакетах) — они указывают углы вращения в градусах. (если вам больше нравится использовать не градусы а радианты то используйте setQuat() метод)
Вы можете изменить размер объекта, как по всем осям так и по отдельности (x,y или z).
myNodePath.setScale(uniform)
Иногда нужно работать индивидуально с каждой осью:
myNodePath.setX(X)
myNodePath.setY(Y)
myNodePath.setZ(Z)
myNodePath.setH(H)
myNodePath.setP(P)
myNodePath.setR(R)
myNodePath.setSx(SX)
myNodePath.setSy(SY)
myNodePath.setSz(SZ)
Или сразу со всеми параметрами
myNodePath.setPosHprScale(X,Y,Z,H,P,R,SX,SY,SZ)
Вы также можете запросить текущие параметры трансформации:
myNodePath.getPos()
myNodePath.getX()
myNodePath.getY()
myNodePath.getZ()
Также с помощью функций setTag() и getTag() вы можете хранить собственную информацию в виде пар ключ-значение. Например:
myNodePath.setTag('Key', 'Value')
Более продвинутая возможность — вы можете также установить или считать положение (или любое из свойств трансформации) отдельного NodePath по отношению к другому. Чтобы сделать это, укажите относительный NodePath в качестве первого параметра:
myNodePath.setPos(otherNodePath,X,Y,Z)
myNodePath.getPos(otherNodePath)
указывая NodePath в качестве первого параметра в любых операциях трансформации выполняется относительная операция. Вышеуказанная операция setPos() означает установить myNodePath в положение (X,Y,Z) относительно otherNodePath — это значит положение myNodePath будет там, где был бы дочерний узел для otherNodePath и его положение было бы установлено в (X,Y,Z). getPos() возвращает положение myNodePath где бы он был если бы был дочерним узлом otherNodePath.
Также важно помнить что вы можете использовать NodePath сам по себе для относительных преобразований. Это может быть полезно в ситуациях когда вы работаете с дистанцией. Например:
# переместить myNodePath на 3 единицы прямо по оси x
myNodePath.setPos(myNodePath,3,0,0)
Относительные преобразования — очень мощная возможность Panda графов сцены, но иногда вы можете получить не тот результат, что ожидали.
Метод lookAt() поворачивает модель «лицом» к другому объекту, это значит, что ось +Y одного объекта будет совпадать с осью другого. Помните, что у модели ось +Y при создании может не совпадать с реальным «лицом», как бы хотели вы и поэтому метод lookAt() может не сработать правильно.
MyNodePath.lookAt(otherObject)
Изменение цвета — еще одна возможность изменений. Значения цветов — числа с плавающей точкой от 0 до 1, 0 — черный 1 — белый.
MyNodePath.setColor(R,G,B,A)
Если у модели есть текстуры, то они могут отображаться не так как задумано или даже отображаться с другим цветом. Устанавливая цвет в белый может восстановить видимость текстуры, но лучше всего просто убрать (отчистить) настройки цвета.
MyNodePath.clearColor()
Запомните четвертый параметр цвета — альфа. Он обычно используется для указывания прозрачности и обычно равен 1.0 чтобы указать, что объект не прозрачный. Если вы устанавливаете альфа между 0 и 1 вы можете сделать объект невидимым. Чтобы использовать прозрачность ее надо активировать:
myNodePath.setTransparency(TransparencyAttrib.MAlpha)
Параметр для setTransparency() это обычно TransparencyAttrib.MAlpha — это прозрачность. Вы можете также выключить прозрачность с помощью параметра TransparencyAttrib.MNone. (Возможны и другие режимы но об этом в другой раз. В старом коде можно передавать 0 или 1 в этом параметре, но лучше использовать имена режимов) Если вы сначала не активируете прозрачность, то альфа компонент цвета может игнорироваться. Не используйте прозрачность без нужды, так как это влияет на требования рендеринга и требует дополнительные аппаратные ресурсы.
Установка цвета для объекта заменяет все цвета вершин. Если вы создали модель и раскрасили ее вершины по разному то предпочтете модулировать цвет объекта без потери цветов вершин. Для этого есть метод setColorScale(), который умножает цвет вершин на указанный существующий цвет вершин:
myNodePath.setColorScale(R,G,B,A)
одно из применений setColorScale() это использование его на вершине графа сцены (render) чтобы затемнить всю сцену одновременно, например реализовать эффект перехода в темноту.
Так как альфа также важна, есть также метод для изменения его без влияния на компоненты цветов:
myNodePath.setAlphaScale(SA)
Чтобы временно скрыть объект на всех камерах испольуйте hide() и show():
myNodePath.hide()
myNodePath.show()
если вы хотите скрыть объект на одной камере но оставить на другой вы можете использовать команды hide() и show() вместе с функцией camera.setCameraMask():
camera1.node().setCameraMask(BitMask32.bit(0))
camera2.node().setCameraMask(BitMask32.bit(1))
myNodePath.show(BitMask32.bit(1)) # объект будет показан только на камере 2
Пожалуйста, запомните, что использование hide/show без аргументов будет работать только для hide/show без аргументов, то есть если вы скрыли объект с помощью hide() то не покажите его с помощью show(bit)) Чтобы скрыть объект со всех камер лучше использовать nodepath.hide(BitMask32.allOn()) Чтобы установить маску камеры для камеры по-умолчанию используйте base.cam а не base.camera. Детально будет описано в секции по камерам.
Если к скрытому объекту были прикреплены дочерние узлы, то они тоже скроются.
Если будут проблемы с размещением, масштабом или вращением ваших узлов вы можете использовать функцию place() чтобы появлялся небольшой интерфейс GUI который поможет вам. Чтобы его использовать нужно установить TkInter.
MyNodePath.place()
Подписаться на:
Комментарии к сообщению (Atom)
Спасибо за блог, очень познавательно :)
ОтветитьУдалитьПожалуйста, будем изучать по ходу перевода
ОтветитьУдалить