Делаю попытку сконструировать робота(пока это слишком громко сказано)
из примитивов из сдк движка.
- есть туловище - Бокс и
- есть пушка - Цилиндр.
Пытаюсь совместить эти две детали на нодах и далее на общей сцене.
что получается:
(ролик разбит на две части)
1. нода цилиндра позиционируется Vector3(0.f, 10.f, 0.f);
2. нода цилиндра позиционируется Vector3(1.f, 10.f, 0.f);
это хочу сделать, чтобы отделить фейс от зада.
Как исправить?
- - -
Предложенные решения:
1.
Dozorniy
> Делай класс робота как компонент
2.
Salamandr
> тебе понадобится какой то конструктор или редактор
А чего ты хочешь добиться? Выглядит так, будто цилиндр всегда рисуется после бокса. Да и код какой-то... странный. Делай класс робота как компонент, и не занимайся всякими извращениями.
И зачем ты так позиционируешь пушку? Если она потомок чего-то, то позиционируется она относительно координат родителя, и никак иначе.
Dozorniy
> А чего ты хочешь добиться?
вы видос не смотрели - там всего то 1 минута.
или вопрос по дальней перспективе?
на данном этапе хочу понять что можно и чего нельзя в движке.
Dozorniy
> Выглядит так, будто цилиндр всегда рисуется после бокса
положение камеры влияет на позиционирование пушки.
там есть ещё дефекты с отвалившимся z-буфером, если погружать пушку в тело бокса.
Dozorniy
> И зачем ты так позиционируешь пушку?
примитив же юзаю, или нужно только через блендер?
и иначе никак?
есть же примитивы - и я пытаюсь ими собрать композицию сборной модели.
Dozorniy
> Да и код какой-то... странный
код как в примерах, ну, в некоторых из них:
1. юзаю дерево нодов
2. на сцене создаю нод- пустой
3. + нод с боксом
4. + нод с цилиндром
5. через ноды делаю трансформации в нужную форму.
но потестил и другие комбинации из нод туда или сюда - везде лажа...
блин, ну, согласен, что странно,
но вопрос не про оптимизацию, а как из СТАНДАРТНЫХ примитивов собрать сборную модель???
мож там какой нить статикгрупп нужен или динамикмодель?
изначально я делаю игор про сборку роботов, поэтому мне в любом случае придётся разобраться...
Dozorniy
> Делай класс робота как компонент
приму к действию - попробую расшифровать.
xlat-code
> в тело бокса.
так проще, (коль уж модель всё равно из примитивов)
> а как из СТАНДАРТНЫХ примитивов собрать сборную модель???
> мож там какой нить статикгрупп нужен или динамикмодель?
неа неа, Node->Node-><StaticModel>()->Node<..model>->Node<..model>
ничего больше.
Главная нода меша не содержит модели, но её потомки содержат.
Но в таком случае тебе понадобится какой то конструктор или редактор, редактор УРхо делает ведь тоже самое. Создавай это всё в нём, загружай сцену через XML или бери отдельные части этого XML.
Salamandr
> Главная нода меша не содержать модели, но её потомки содержат.
так исходник(класса меха) я показал - всё так и делаю на "чистом" ООП,
создаю один раз - на старте проги,
но говорят нужен класс компонента - написать или хз, в движке есть готовый,
ну и его и юзаю, именно статикмодель.
есть ещё класс Армия, который будет заниматься набором в себя этих мехов.
Salamandr
> Но в таком случае тебе понадобится какой то конструктор или редактор, редактор
> УРхо делает ведь тоже самое. Создавай это всё в нём, загружай сцену через XML
> или бери отдельные части этого XML.
да вот у меня есть чуйка, что разрулить я смогу только через редактор...
но спортивный интерес тогда только усиливается - я про решение без редактора ...
xlat-code
> примитив же юзаю, или нужно только через блендер?
> и иначе никак?
>
> есть же примитивы - и я пытаюсь ими собрать композицию сборной модели.
Да без разницы, логика позиционирования от этого не меняется. Тем более, что встроенные примитивы — точно такие же модели, созданные в Blender'е.
xlat-code
> но вопрос не про оптимизацию, а как из СТАНДАРТНЫХ примитивов собрать сборную
> модель???
Всё так же, как и у тебя, только, похоже, немного не те координаты используешь. Я так понимаю, posf — это координаты относительно сцены, а потом ты по этим координатам пытаешься установить позицию пушки, тогда как она должна позиционироваться относительно родителя, и безо всяких умножений, т.е. вместо
gunn.position = posf * Vector3(1.0f, 10.f, 0.0f);
У тебя должно быть просто
gunn.position = Vector3(1.0f, 10.f, 0.0f); //Смещение относительно координат родителя.
А вообще, сложно читать, из-за того, что не совсем понятно, что, для чего, и когда вызывается. Перепиши как компонент — и всё сразу станет понятней и проще.
И ещё раз спрашиваю: что твой робот должен делать? Я так понимаю, поворачиваться вокруг вертикальной оси, и поднимать/опускать пушку? От этого зависит иерархия нод.
Dozorniy
> У тебя должно быть просто
это же класс для всех роботов на сцене - они могут появляться в разных местах сцены,
поэтому там в криейт будет подаваться координаты появления робота на сцене,
ну, и эти координаты надо умножить на шаг сетки сцены, а иначе ни как.
ну, можно подавать уже умноженные, но это как перемена слагаемых ...
Dozorniy
> Перепиши как компонент — и всё сразу станет понятней и проще.
примерно хоть как он должен выглядеть энтот компонент?
xlat-code
> примерно хоть как он должен выглядеть энтот компонент?
Странно, что ты не покопался в примерах — там всё есть. Ну ладно, расскажу основы.
В движке есть такая замечательная вещь, как
LogicComponent, который позволяет наделять объекты логикой, так сказать, естественным способом. В AS есть компонент ScriptObject, который полностью дублирует функционал LogicComponent'а. Данные классы содержат несколько предопределённых методов, которые вызываются движком автоматически, что очень удобно:
Start() — вызывается после добавления данного компонента к ноде (другие компоненты в этот момент могут ещё не существовать).
DelayedStart() — вызывается перед первым обновлением (все остальные компоненты уже гарантированно существуют).
Stop() — вызывается при отсоединении компонента от ноды (обычно, при удалении ноды).
Update(float timeStep) — вызывается при обновлении сцены (т.е. каждый кадр). timeStep — дельта между текущим кадром, и предыдущим.
PostUpdate(float timeStep) — вызывается после обновления сцены.
FixedUpdate(float timeStep) — вызывается при обновлении физики.
FixedPostUpdate (float timeStep) — вызывается после обновления физики.
Так же доступна внутренняя переменная node — указатель на ноду, к которой прикреплён компонент.
Что бы задействовать данный компонент, нужно унаследовать от него класс, и переопределить нужные методы, например:
class Robot : ScriptObject { void Update(float timeStep) { //Делаем что-то, что должно выполняться каждый кадр } }
Само собой, никто не запрещает определять в унаследованном классе свои методы, и переменные.
Далее получившийся компонент вешаем на ноду:
Node@ node = scene_.CreateChild(); //Создаём ноду node.position = Vector3( 0.0f, 0.0f, 20.0f); //Задаём ей позицию Robot@ logic = cast<Robot>( node.CreateScriptObject( scriptFile, "Robot")); //Магия) //scriptFile — глобальная переменная AS.
Вот и вся премудрость. А получить указатель на этот компонент можно так:
Robot@ logic = cast<Robot>(node.scriptObject);
Dozorniy
> > примерно хоть как он должен выглядеть энтот компонент?
> Странно, что ты не покопался в примерах — там всё есть. Ну ладно, расскажу
> основы.
> В движке есть такая замечательная вещь, как
> LogicComponent, который позволяет наделять объекты логикой, так сказать,
> естественным способом. В AS есть компонент ScriptObject, который полностью
> дублирует функционал LogicComponent'а. Данные классы содержат несколько
> предопределённых методов, которые вызываются движком автоматически, что очень
> удобно:
> Start() — вызывается после добавления данного компонента к ноде (другие
> компоненты в этот момент могут ещё не существовать).
> DelayedStart() — вызывается перед первым обновлением (все остальные компоненты
> уже гарантированно существуют).
> Stop() — вызывается при отсоединении компонента от ноды (обычно, при удалении
> ноды).
> Update(float timeStep) — вызывается при обновлении сцены (т.е. каждый кадр).
> timeStep — дельта между текущим кадром, и предыдущим.
> PostUpdate(float timeStep) — вызывается после обновления сцены.
> FixedUpdate(float timeStep) — вызывается при обновлении физики.
> FixedPostUpdate (float timeStep) — вызывается после обновления физики.
>
> Так же доступна внутренняя переменная node — указатель на ноду, к которой
> прикреплён компонент.
>
> Что бы задействовать данный компонент, нужно унаследовать от него класс, и
> переопределить нужные методы, например:
>
> class Robot : ScriptObject
> {
> void Update(float timeStep)
> {
> //Делаем что-то, что должно выполняться каждый кадр
> }
> }
> Далее получившийся компонент вешаем на ноду:
>
> Node@ node = scene_.CreateChild(); //Создаём ноду
> node.position = Vector3(0.0f, 0.0f, 20.0f); //Задаём ей позицию
>
> Robot@ logic = cast<Robot>(node.CreateScriptObject(scriptFile, "Robot"));
> //Магия)
> //scriptFile — глобальная переменная AS.
> Вот и вся премудрость. А получить указатель на этот компонент можно так:
> Robot@ logic = cast<Robot>(node.scriptObject);
+100
скопипастил, а то в тяжелое время живём - время неуловимых джо)))
ваш пост можно сразу отправить в раздел "ДЕЛИТЕСЬ КОДОМ И ТУТОРИАЛАМИ"
Dozorniy
> Странно, что ты не покопался в примерах
я сначала делаю, а потом копаюсь - типа решения проблем по мере поступления)
xlat-code
> скопипастил, а то в тяжелое время живём - время неуловимых джо)))
Покопайся ещё в AS-исходниках примеров в share\resources\Data\Scripts, а конкретно в CharacterDemo, и VehicleDemo — там как раз применяется этот компонент.
Dozorniy
> Покопайся ещё в AS-исходниках примеров в share\resources\Data\Scripts, а
> конкретно в CharacterDemo, и VehicleDemo — там как раз применяется этот
> компонент.
реальное спасибо!
Удобно, не правда ли? Создал ноду, повесил на неё логику, задал параметры, если надо, а дальше уже логика работает самостоятельно, и никаких извращений с умножением позиций, ручным обновлением всего этого, и т.д.
Dozorniy
> У тебя должно быть просто
> gunn.position = Vector3(1.0f, 10.f, 0.0f); //Смещение относительно координат
> родителя.
выше я протрендел, а вот щас внимательно поглядел и
БА это сюда копипаста проникла из родительской ноды,
убрал множитель и вроде(?) дефект пропал
как он там влиял на динамику - не понятно, если он там только на старте применяется ...
почему "вроде",
я уже дюже придирчиво щас вглядываюсь, что любой пиксель не на месте уже караул-пропало))
короче, кажется, всё заработало для глаз.
но урок от вас я принял.
Dozorniy
> Удобно, не правда ли?
не вопрос, а уже ответ)
я хочу как можно быстрее сделать демку, а потому уже буду джва года рефакторить)
а с другой и правильной стороны то, если правильно начать и рефакторить почти не придётся :|
Dozorniy
> Странно, что ты не покопался в примерах — там всё есть
вчера в предчувствии копания в примерах озаботился я лучшей иде для англскрипта,
смотрел атом vc и ещё много чего, но остался на ноутпеде++
у него есть глюки со списком функций,
кончилось тем что я обнаружил себя на гитхабе копающегося в исходниках этого самого нп++
блин, свят свят свят :лол
но это отдельная история...
xlat-code
> у него есть глюки со списком функций,
Я тоже в notepad++ на AS пишу, и мне этот список функций не нужен: открыл раздел со списком классов в браузере — и вперёд)
ёж
> искал что-нибудь
я вот думаю, вокруг всё завалено всяким барахлом, а кинешься за тем,
что нужно, так днём с огнём не найдешь ...
в том же C::B авторы спецом отключили Symbols в исходниках,
объяснив тем что он перегревает комп...
Тема в архиве.