Terathon Software C4Форум

Вопросы по С4 (3 стр)

Страницы: 1 2 3 4 Следующая »
#30
14:21, 27 ноя 2014

Никак.
Надо найти нужный тебе GeometryObject внутри и дальше уже так: http://www.terathon.com/wiki/index.php/Geometry_Internals
Сама Model - это просто контейнер для кучи других нодов.

#31
15:10, 27 ноя 2014

DeadMeat
> Надо найти нужный тебе GeometryObject внутри и дальше уже так: http://www.terathon.com/wiki/index.php/Geometry_Internals
Окей, спасибо. Самый прикол, что это я эту картинку уже видел, а вот сейчас чего-то растерялся, сижу, роюсь в исходниках, голова кругом идёт.

#32
19:54, 27 ноя 2014

DeadMeat
> Надо найти нужный тебе GeometryObject
Мда. Вот с этим реальная проблема. Ума не приложу как его извлечь.
GetNodeHash(), FindNode(hash), GetObject() возвращают нули.

#33
20:17, 27 ноя 2014

Саша123
> Мда. Вот с этим реальная проблема. Ума не приложу как его извлечь.
> GetNodeHash(), FindNode(hash), GetObject() возвращают нули.
Вообще не проблема.
По имени:

model->FindNode(Text::StaticHash<'N', 'a', 'm', 'e'>::value);

Перебором:

Node* node = model->GetFirstSubnode();
while (node)
{
if (node->GetNodeType() == kNodeGeometry)
{...}
node = node->Next();
}

Чтобы запросить объект указатель, естественно, надо потом преобразовать.

Если перебор не сработает, значит у тя модель просто пустая.

#34
21:11, 27 ноя 2014

DanielSky
> Если перебор не сработает, значит у тя модель просто пустая.
Ну, на экране она рисуется.
Однако ничего не получается.

Вот кратенько :

/// Конструктор
TankEntity::TankEntity(char *fileModel, uint32 flags) : GameEntity(GameEntity::Type_Dynamic, GameEntity::Kind_Tank) {
    if (!TheModelReg) {
        TheModelReg = new ModelRegistration(modelTank, "Tank abrams", fileModel, flags, controllerTank);
    }
    modelReg = TheModelReg;
    if (!TheControllerReg) {
        TheControllerReg = new ControllerReg<TankController>(controllerTank, "Tank abrams");
    }
    controllerReg = TheControllerReg;
  model = Model::Get(modelTank);
    model->SetController(new TankController());
}

/// Создаю и добавляю
  for (int i = 0; i < 1; i++) {
    TankEntity *tank = new TankEntity("abrams");
    tank->SetPosition(Point3D(0.0f, 0.0f, 0.0f));
    static_cast<GameWorld*>(TheWorldMgr->GetWorld())->AppendNewToWorld(tank);
    tank->Normalization();
  }

/// А здесь перебираем ноды
void GameEntity::Normalization() {
  Node *node = model->GetFirstSubnode();
  while (node) {
    if (node->GetNodeType() == C4::kNodeGeometry) {
      TheEngine->Report("Find node");
    }
    C4::NodeType type = node->GetNodeType();
    TheEngine->Report(node->GetNodeName() + node->GetNodeType());
    node = node->Next();
  }
}

Пишет, что есть один Node с именем Group01 c типом 0.
А вот что на экране: Изображение


Чую, где-то я ошибся. То, что под моделью находится - тоже потомок GameEntity, и для него Normalization я не вызываю. А он почему-то вызывается сам. Т.е. вызывается три раза - два раза в конструкторе GameEntity (по разу для каждой) и третий раз, когда я его сам вызываю.

#35
22:23, 27 ноя 2014

Саша123
> Пишет, что есть один Node с именем Group01 c типом 0.
Ясно. Предположу, что у тебя геометрия лежит в группе Group01. А мой пример перебора ковыряет только корень модели. Тебе же нужно перебрать дальнейшие уровни иерархии.
Это удобно сделать рекурсией:

void FindGeo(Node* node) 
{
subNode = node->GetFirstSubnode();
  while (subNode) 
  {
    if (node->GetNodeType() == C4::kNodeGeometry) {
     TheEngine->Report("Find node"); }
     FindGeo(Node* subNode); 
    subNode = subNode->Next();
  }
}
#36
22:41, 27 ноя 2014

DanielSky
> Ясно. Предположу, что у тебя геометрия лежит в группе Group01. А мой пример перебора ковыряет только корень модели. Тебе же нужно перебрать дальнейшие уровни иерархии.
Точно. Так и было. Теперь понятно : C4::kNodeGeneric означает, что в нём хранятся ещё ноды.
Спасибо.

#37
23:04, 27 ноя 2014

Саша123
> Теперь понятно : C4::kNodeGeneric означает, что в нём хранятся ещё ноды.
В любой узел можно запихать другие узлы, а тип узла говорит только о характере его самого. Если узел ничего не делает и нужен только для структуры сцены, то он типизируется как kNodeGeneric. Но вообще это чистый лист для творчества, предполагается что к нему можно что угодно пришпилить. Но я не пробовал.

#38
17:31, 11 янв 2015

Задать дальность видимости в камере нельзя, я так понимаю?

#39
0:19, 13 янв 2015

Саша123
> Задать дальность видимости в камере нельзя, я так понимаю?
Смотря что ты имеешь ввиду. Можно задать камере длину фокусировки (focal lenth).

#40
9:09, 13 янв 2015

DanielSky
> Смотря что ты имеешь ввиду. Можно задать камере длину фокусировки (focal lenth).
Сейчас нет доступа к проэкту, вечером посмотрю.
Я имел ввиду дальнюю плоскость отсечения. При некотором удалении от сцены та просто исчезает. Обычно в камере есть возможность задания ближней и дальней плоскости. Вот это я и имел ввиду.
По описанию:
focal - The focal length of the perspective projection. This determines the field of view.
Похоже. Но как его трактовать? Возможно, это и есть значение дальней плоскости, а ближняя устанавливается "автоматически"?

#41
11:10, 13 янв 2015

А ещё у него есть такая штука, как Antivector4D. Чё за ерундень такая и где можно почитать про соотв. математику?

#42
13:16, 13 янв 2015

Саша123
Длина фокусировки сдвигает изображение целиком. А ты, кажется, говоришь про глубину изображения, ее тоже можно задавать (SetNearDepth и SetFarDepth), но я этого не делаю, не знаю какой технически будет эффект.
В свойствах объекта антивектор используется просто как набор данных и значить может что угодно. В камере, скорее всего это связано с прямоугольником видимости. Нафига имеено как антивектор - не знаю.

#43
13:30, 13 янв 2015

DanielSky
> SetNearDepth и SetFarDepth
Точно, похоже оно. Всё согласно идеологии движка - получаем объект, и уже через него меняем свойства)

DanielSky
> В камере, скорее всего это связано с прямоугольником видимости.
Нет, я в общем спрашивал, не касаясь камеры.

Сейчас вот подвисаю с CameraWidget - пока получилось отобразить его в пространстве, но вот как прикрепить его к интерфейсу, пока не понимаю. Вроде бы и пару топиков на форуме нашёл, но что-то никак.

#44
23:02, 13 янв 2015

Саша123
В матане я никакого антивектора тоже не знаю. В С4 он, в основном, характеризует положение плоскости в пространстве, это точно. Но как он направлен по отношению к плоскости - не знаю. Предполагаю, что это вектор касательной, то есть противоположный вектору нормали.
CameraWidget не пользую.

Страницы: 1 2 3 4 Следующая »
Terathon Software C4Форум

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