Среда, 21.11.2018, 16:15
Мир Irrlicht
Главная | Форум | Статьи | Файлы | Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » Irrlicht » Обсуждение движка » Полезные куски кода. (Когда написано мало, но по делу.)
Полезные куски кода.
ZigZagДата: Пятница, 23.07.2010, 19:14 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Полезные куски кода
http://moldovania.3dn.ru/publ/poleznye_kuski_koda_chast_1/4-1-0-7

Отсюда вопрос: все ли эти куски полезны?(а то, не все йогурты бывают одинаково полезны)

Мои вопросы.
1. Как сделать скалирование/изменение масштаба модели?
2. Можно ли в Иррлихте получить объект(или группу объектов) под курсором(как бы выделение объекта щелчком) или выделение всех в области?
3. Можно ли сделать скибокс(Sky Box)? Или надо сразу делать всю карту, и с небом тоже?
3. Можно ли сделать редактор карт по тайлам? Или опять же, только карты одним большим куском?
4. Как сделать вращение объекта по всем 3 осям?
5. Есть ли в Иррлихте deltaTime или его надо делать самому?
6. В чём выражается ориентация объектов в Иррлихте(в кватернионах или углах Эйлера или ещё в чём?).
7. Как обстоят дела с отображением больших открытых пространств? И с чем Иррлихт лучше работает - с открытыми или закрытыми пространствами?
8. Где найти ещё больше полезных кусков кода?
9. ...

В общем, может быть по ходу ещё таких вопросов напридумаю. А в эту темку я предлагаю тащить небольшие, но мегаполезные куски кода по Иррлихту.

 
RAngerДата: Суббота, 24.07.2010, 02:51 | Сообщение # 2
Рядовой
Группа: Пользователи
Сообщений: 13
Репутация: 0
Статус: Offline
копипастить всегда полезно и приятно. Главное - код отрестайлить потом XD

1) В коде Meshviewer - а ( он очень стильный, кстати ) можно посмотреть - компилим справку и смотрим))) копипаста::

Code
scene::ISceneNode* Model = 0;// Вместо нуля там гемор))
core::vector3df scale ( 1.0f, 5.0f, 1.0f );
if ( Model )
{Model->setScale ( scale );}

6) =-O это какое конкретно??
7) Morrowind сделать можно))
8) В исходниках лихта они есть Ж;-)#

Остальное когда - нибудь потом))

Сообщение отредактировал RAnger - Суббота, 24.07.2010, 02:52
 
ZigZagДата: Среда, 28.07.2010, 12:01 | Сообщение # 3
Рядовой
Группа: Пользователи
Сообщений: 8
Репутация: 0
Статус: Offline
Quote
Code

Спасибо большое. В обучающих целях хотел застряпать модель солнечной системы. В примерах Иррлихта вроде нашёл всё необходимое(там где комета с огненным хвостом летает вокруг планеты), а вот про скалирование пропустил.

Quote (RAnger)
6) =-O это какое конкретно??

Мне, в принципе с анимацией предпочтительнее. Допустим, объект *.obj(в него из макса экспортировать можно). Далее объект *.3ds. Хотя и про *.x будет интересно знать.
Это полезно для много.

Вот скажем загрузил я анимированного чувака(или хоть танк с вращающейся башней), а как поставить его "лицевой часть" к противнику? Для этого надо:
1. Получить позицию противника.
2. Получить текущий вектор танка.
3. Получить направление от танка на противника.
4. Плавно преобразовать 2 в 3.(например прибавлением процента от разницы 2+=%(2-3) )

В принципе я это сам могу сделать(ибо делал такое уже), но остаётся узнать как получить вектор направления модели. В общем на паскале всё выглядит примерно так:

Code
var
     Form1: TForm1;
     const
     XNotOne         : TVector = (0.9950372,0.09950372,0,0); //X,Y,Z,W
     NegativeXNotOne : TVector = (-0.9950372,0.09950372,0,0);
implementation

{$R *.dfm}

procedure TForm1.UpToTarget(Source,Target : TGLBaseSceneObject; deltaTime : double);
var
      absUpTarg : TVector;
begin
// Куда надо указывать носом (ракеты), чтобы это был вектор на цель...
      absUpTarg:=VectorSubtract(Target.AbsolutePosition, Source.AbsolutePosition); //Позицию цели (на кого надо указывать носом) отнять позицию того кто должен указывать носом
      NormalizeVector(absUpTarg); //Нормализовать результат

     with Source.Up do
     begin
     //Чтобы не стопорилось на X...
     if X=1
     then AsVector:=XNotOne
     else
     if X=-1
     then AsVector:=NegativeXNotOne; //Близкие к 1 и -1 неединичные значения...

     //Прибавить к направлению "Ракеты" скалированое и связанное с deltaTime значение направления (для плавного поворота)
     AddScaledVector(1.5*deltaTime,absUpTarg); //Работает полунормально (только если X объекта-"ракеты" не равен 1(или -1))
     end; // with
end; //begin UpToTarget

procedure TForm1.GLCadencer1Progress(Sender: TObject; const deltaTime,
     newTime: Double);
begin
with GLCone1.Position do //// ( note : VectorCombine(v1, v2, f1, f2)=v1*f1+v2*f2 )
AsVector:=VectorCombine(
AsVector, GLCone1.Up.AsVector, 1, deltaTime);

UpToTarget(GLCone1,GLCone2,deltaTime);
end;

end.

В общем пригодится знание в Ирролихте аналогов ф-ций:
1. NormalizeVector()
2. AddScaledVector()
3. VectorCombine()
И иже с ними.(VectorCrossProduct() и т.д.)
В общем, всё что отсюда и даже больше:
http://www.gamedev.ru/articles/?id=30038

Гы-гы, прикол. Между прочим, это моя статья:
http://www.progerin.org.ua/index.php?showtopic=3261

ток я её там не постил. Ну да ладно. Хорошей информации должно быть много. И

Quote (моя)
Vec[3]. Элемент w используется для математических операций с участием векторов и двумерных массивов, квадратных массивов-матриц и по идее w всегда должен быть равен нулю, так что на него можно не обращать внимания.

w должен быть равен 1. Потому, что это фактор длины вектора. И в шматрицах он = 1. Но тогда, когда писал статью, я этого не знал.

Добавлено (26.07.2010, 14:54)
---------------------------------------------
Ну, покопался, кое что нашёл.

По своим же вопросам нашёл в примере Example 011 Per-Pixel Lighting:

1. Ещё один вариант:

Code
scene::IMeshManipulator *manipulator = smgr->getMeshManipulator();

core::matrix4 m;
m.setScale ( core::vector3df(50,50,50) );
manipulator->transformMesh( tangentSphereMesh, m );

sphere->setPosition(core::vector3df(-70,130,45)); //А это установка позиции

5. Как сделать вращение объекта по всем 3 осям?

Code
scene::ISceneNodeAnimator* anim =
smgr->createRotationAnimator(core::vector3df(0,0.1f,0));
sphere->addAnimator(anim);
anim->drop();

3. Можно ли сделать скибокс(Sky Box)?
Вопрос снимается, потому, что можно, о чём написано тут:
http://www.gamedev.ru/code/terms/Irrlicht

из примера Movement по заданию модели ориентации:

Code

//создание модели
scene::IAnimatedMeshSceneNode* anms =   
    smgr->addAnimatedMeshSceneNode(smgr->getMesh("../../media/ninja.b3d"));

Code
anms->setScale(core::vector3df(2.f,2.f,2.f)); //Ещё один способ установки скале
anms->setRotation(core::vector3df(0,-90,0)); //Похоже на способ задания орентации

//А вот ещё один вариант создания модели:

Code
scene::IAnimatedMesh* m = Device->getSceneManager()->getMesh( filename.c_str() );

Добавлено (28.07.2010, 12:01)
---------------------------------------------
Ага, таки отыскал как повернуть персонажа в сторону врага тут:
http://www.gamedev.ru/community/irrlicht/forum/?id=86386

Code
vector3df vec = camera->getPosition() - Monster->getPosition();
   vec.normalize();
   Monster->setRotation(vec.getHorizontalAngle());


Сообщение отредактировал ZigZag - Понедельник, 26.07.2010, 14:56
 
Форум » Irrlicht » Обсуждение движка » Полезные куски кода. (Когда написано мало, но по делу.)
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2018 Создать бесплатный сайт с uCoz