Никак.
Надо найти нужный тебе GeometryObject внутри и дальше уже так: http://www.terathon.com/wiki/index.php/Geometry_Internals
Сама Model - это просто контейнер для кучи других нодов.
DeadMeat
> Надо найти нужный тебе GeometryObject внутри и дальше уже так: http://www.terathon.com/wiki/index.php/Geometry_Internals
Окей, спасибо. Самый прикол, что это я эту картинку уже видел, а вот сейчас чего-то растерялся, сижу, роюсь в исходниках, голова кругом идёт.
DeadMeat
> Надо найти нужный тебе GeometryObject
Мда. Вот с этим реальная проблема. Ума не приложу как его извлечь.
GetNodeHash(), FindNode(hash), GetObject() возвращают нули.
Саша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( ); }
Чтобы запросить объект указатель, естественно, надо потом преобразовать.
Если перебор не сработает, значит у тя модель просто пустая.
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 (по разу для каждой) и третий раз, когда я его сам вызываю.
Саша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( ); } }
DanielSky
> Ясно. Предположу, что у тебя геометрия лежит в группе Group01. А мой пример перебора ковыряет только корень модели. Тебе же нужно перебрать дальнейшие уровни иерархии.
Точно. Так и было. Теперь понятно : C4::kNodeGeneric означает, что в нём хранятся ещё ноды.
Спасибо.
Саша123
> Теперь понятно : C4::kNodeGeneric означает, что в нём хранятся ещё ноды.
В любой узел можно запихать другие узлы, а тип узла говорит только о характере его самого. Если узел ничего не делает и нужен только для структуры сцены, то он типизируется как kNodeGeneric. Но вообще это чистый лист для творчества, предполагается что к нему можно что угодно пришпилить. Но я не пробовал.
Задать дальность видимости в камере нельзя, я так понимаю?
Саша123
> Задать дальность видимости в камере нельзя, я так понимаю?
Смотря что ты имеешь ввиду. Можно задать камере длину фокусировки (focal lenth).
DanielSky
> Смотря что ты имеешь ввиду. Можно задать камере длину фокусировки (focal lenth).
Сейчас нет доступа к проэкту, вечером посмотрю.
Я имел ввиду дальнюю плоскость отсечения. При некотором удалении от сцены та просто исчезает. Обычно в камере есть возможность задания ближней и дальней плоскости. Вот это я и имел ввиду.
По описанию:
focal - The focal length of the perspective projection. This determines the field of view.
Похоже. Но как его трактовать? Возможно, это и есть значение дальней плоскости, а ближняя устанавливается "автоматически"?
А ещё у него есть такая штука, как Antivector4D. Чё за ерундень такая и где можно почитать про соотв. математику?
Саша123
Длина фокусировки сдвигает изображение целиком. А ты, кажется, говоришь про глубину изображения, ее тоже можно задавать (SetNearDepth и SetFarDepth), но я этого не делаю, не знаю какой технически будет эффект.
В свойствах объекта антивектор используется просто как набор данных и значить может что угодно. В камере, скорее всего это связано с прямоугольником видимости. Нафига имеено как антивектор - не знаю.
DanielSky
> SetNearDepth и SetFarDepth
Точно, похоже оно. Всё согласно идеологии движка - получаем объект, и уже через него меняем свойства)
DanielSky
> В камере, скорее всего это связано с прямоугольником видимости.
Нет, я в общем спрашивал, не касаясь камеры.
Сейчас вот подвисаю с CameraWidget - пока получилось отобразить его в пространстве, но вот как прикрепить его к интерфейсу, пока не понимаю. Вроде бы и пару топиков на форуме нашёл, но что-то никак.
Саша123
В матане я никакого антивектора тоже не знаю. В С4 он, в основном, характеризует положение плоскости в пространстве, это точно. Но как он направлен по отношению к плоскости - не знаю. Предполагаю, что это вектор касательной, то есть противоположный вектору нормали.
CameraWidget не пользую.
Тема в архиве.