Войти
Urho3DФорумЗАДАВАЙТЕ ВОПРОСЫ

Сборка робота из примитивов. Баг ...

#0
19:11, 15 дек 2021

Делаю попытку сконструировать робота(пока это слишком громко сказано)
из примитивов из сдк движка.

- есть туловище - Бокс и
- есть пушка - Цилиндр.

Пытаюсь совместить эти две детали на нодах и далее на общей сцене.

что получается:

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

(ролик разбит на две части)
1. нода цилиндра позиционируется Vector3(0.f, 10.f, 0.f);
2. нода цилиндра позиционируется Vector3(1.f, 10.f, 0.f);

это хочу сделать, чтобы отделить фейс от зада.

+ Код меха полностью:

Как исправить?

- - -

Предложенные решения:
1.
Dozorniy
> Делай класс робота как компонент

2.
Salamandr
> тебе понадобится какой то конструктор или редактор

#1
21:40, 15 дек 2021

А чего ты хочешь добиться? Выглядит так, будто цилиндр всегда рисуется после бокса. Да и код какой-то... странный. Делай класс робота как компонент, и не занимайся всякими извращениями.
И зачем ты так позиционируешь пушку? Если она потомок чего-то, то позиционируется она относительно координат родителя, и никак иначе.

#2
0:08, 16 дек 2021

Dozorniy
> А чего ты хочешь добиться?
вы видос не смотрели - там всего то 1 минута.
или вопрос по дальней перспективе?

на данном этапе хочу понять что можно и чего нельзя в движке.

Dozorniy
> Выглядит так, будто цилиндр всегда рисуется после бокса
положение камеры влияет на позиционирование пушки.

там есть ещё дефекты с отвалившимся z-буфером, если погружать пушку в тело бокса.

Dozorniy
> И зачем ты так позиционируешь пушку?
примитив же юзаю, или нужно только через блендер?
и иначе никак?

есть же примитивы - и я пытаюсь ими собрать композицию сборной модели.

Dozorniy
> Да и код какой-то... странный
код как в примерах, ну, в некоторых из них:
1. юзаю дерево нодов
2. на сцене создаю нод- пустой
3. + нод с боксом
4. + нод с цилиндром
5. через ноды делаю трансформации в нужную форму.

но потестил и другие комбинации из нод туда или сюда - везде лажа...

блин, ну, согласен, что странно,

но вопрос не про оптимизацию, а как из СТАНДАРТНЫХ примитивов собрать сборную модель???

мож там какой нить статикгрупп нужен или динамикмодель?

изначально я делаю игор про сборку роботов, поэтому мне в любом случае придётся разобраться...

Dozorniy
> Делай класс робота как компонент
приму к действию - попробую расшифровать.

#3
0:18, 16 дек 2021

xlat-code
> в тело бокса.
так проще, (коль уж модель всё равно из примитивов)

> а как из СТАНДАРТНЫХ примитивов собрать сборную модель???
> мож там какой нить статикгрупп нужен или динамикмодель?
неа неа, Node->Node-><StaticModel>()->Node<..model>->Node<..model>
ничего больше.

Главная нода меша не содержит модели, но её потомки содержат.

Но в таком случае тебе понадобится какой то конструктор или редактор, редактор УРхо делает ведь тоже самое. Создавай это всё в нём, загружай сцену через XML или бери отдельные части этого XML.

#4
0:34, 16 дек 2021

Salamandr
> Главная нода меша не содержать модели, но её потомки содержат.
так исходник(класса меха) я показал - всё так и делаю на "чистом" ООП,
создаю один раз - на старте проги,
но говорят нужен класс компонента - написать или хз, в движке есть готовый,
ну и его и юзаю, именно статикмодель.

есть ещё класс Армия, который будет заниматься набором в себя этих мехов.

Salamandr
> Но в таком случае тебе понадобится какой то конструктор или редактор, редактор
> УРхо делает ведь тоже самое. Создавай это всё в нём, загружай сцену через XML
> или бери отдельные части этого XML.
да вот у меня есть чуйка, что разрулить я смогу только через редактор...

но спортивный интерес тогда только усиливается - я про решение без редактора ...

#5
1:00, 16 дек 2021

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); //Смещение относительно координат родителя.

А вообще, сложно читать, из-за того, что не совсем понятно, что, для чего, и когда вызывается. Перепиши как компонент — и всё сразу станет понятней и проще.

И ещё раз спрашиваю: что твой робот должен делать? Я так понимаю, поворачиваться вокруг вертикальной оси, и поднимать/опускать пушку? От этого зависит иерархия нод.

#6
1:17, 16 дек 2021

Dozorniy
> У тебя должно быть просто
это же класс для всех роботов на сцене - они могут появляться в разных местах сцены,
поэтому там в криейт будет подаваться координаты появления робота на сцене,
ну, и эти координаты надо умножить на шаг сетки сцены, а иначе ни как.

ну, можно подавать уже умноженные, но это как перемена слагаемых ...

Dozorniy
> Перепиши как компонент — и всё сразу станет понятней и проще.
примерно хоть как он должен выглядеть энтот компонент?

#7
1:53, 16 дек 2021

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);
#8
2:23, 16 дек 2021

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
> Странно, что ты не покопался в примерах
я сначала делаю, а потом копаюсь - типа решения проблем по мере поступления)

#9
2:30, 16 дек 2021

xlat-code
> скопипастил, а то в тяжелое время живём - время неуловимых джо)))
Покопайся ещё в AS-исходниках примеров в share\resources\Data\Scripts, а конкретно в CharacterDemo, и VehicleDemo — там как раз применяется этот компонент.

#10
2:34, 16 дек 2021

Dozorniy
> Покопайся ещё в AS-исходниках примеров в share\resources\Data\Scripts, а
> конкретно в CharacterDemo, и VehicleDemo — там как раз применяется этот
> компонент.
реальное спасибо!

#11
2:40, 16 дек 2021

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

#12
3:07, 16 дек 2021

Dozorniy
> У тебя должно быть просто
> gunn.position = Vector3(1.0f, 10.f, 0.0f); //Смещение относительно координат
> родителя.
выше я протрендел, а вот щас внимательно поглядел и
БА это сюда копипаста проникла из родительской ноды,
убрал множитель и вроде(?) дефект пропал

как он там влиял на динамику - не понятно, если он там только на старте применяется ...

почему "вроде",
я уже дюже придирчиво щас вглядываюсь, что любой пиксель не на месте уже караул-пропало))

короче, кажется, всё заработало для глаз.

но урок от вас я принял.

Dozorniy
> Удобно, не правда ли?
не вопрос, а уже ответ)

я хочу как можно быстрее сделать демку, а потому уже буду джва года рефакторить)


а с другой и правильной стороны то, если правильно начать и рефакторить почти не придётся :|

Dozorniy
> Странно, что ты не покопался в примерах — там всё есть
вчера в предчувствии копания в примерах озаботился я лучшей иде для англскрипта,
смотрел атом vc и ещё много чего, но остался на ноутпеде++

у него есть глюки со списком функций,
кончилось тем что я обнаружил себя на гитхабе копающегося в исходниках этого самого нп++

блин, свят свят свят :лол

но это отдельная история...

#13
4:07, 16 дек 2021

xlat-code
> у него есть глюки со списком функций,
Я тоже в notepad++ на AS пишу, и мне этот список функций не нужен: открыл раздел со списком классов в браузере — и вперёд)

#14
15:27, 17 дек 2021

ёж
> искал что-нибудь
я вот думаю, вокруг всё завалено всяким барахлом, а кинешься за тем,
что нужно, так днём с огнём не найдешь ...

в том же C::B авторы спецом отключили Symbols в исходниках,
объяснив тем что он перегревает комп...

Urho3DФорумЗАДАВАЙТЕ ВОПРОСЫ

Тема в архиве.