Припомощи SIO2 мне захотелось сделать землю. Другими словами просто создать шар и наложить на него текстуру.

В процессе этих действий столкнулся с некоторыми проблемками:
- Это какой тип шара можно использовать в SIO2.
- Размер текстуры.
- Накладывание текстуры.

Сейчас пошагово опишу как я это сделал:

Открываем Blender. Удаляем стандартный куб. Нажимаем пробел и в меню выбираем Add -> Mesh -> IcoSphere. Выставляем subdivision на 5, а радиус на 2 к примеру. В низу на панели “Link and Materials” нажимаем “Set Smooth”, а в “Mesh” создаем новую UV Texture, если ее там нету, нажав на кнопку “New”.


Переходим в Shading (Нажать F5), если не создан “Link to Object”, то жмем на кнопку “Add New”. Наводим на шар и нажимаем Tab, он должен подсветиться. Переходим в текстурирование (или нажать F6) и создаем новую текстуру с типом “Image” и в настройке “Image” загружаем картинку нажав на кнопку “Load”. У текстуры ширина должна быть ровна высоте, и не более 1024 пикселов. Вот моя текстура планеты земля.


Разделим экран (нажмите на верхнюю грань и выберите “Split Area”) и в новой областе выберем “UV/Image Editor” и берем нашу текстуру. Наводим на шар нажимаем Tab, далее нажимаем D и выбираем “Textured Solid” мы наблюдаем результат ниже на картинке, текстура наложилась не правильно.

Текстура наложилась неправильно т.к. она по умолчанию накладывается на каждую поверхность. Выбираем шар, нажимаем Tab, нажимаем U и выбираем “Sphere form View”. Можно подкорректировать сетку наложения.


Экспортируем нашу планету по примерам SIO2 (можно скачать мою землю) и закидываем в проект (желательно использовать пример 3), в template.mm прописуем ее имя, компилируем и смотрим на результат:


Чтоб можно было вращать планету добавим немного кода в template.mm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
vec2 start;
void templateScreenTap( void *_ptr, unsigned char _state )
{
     if( sio2->_SIO2window->n_touch )
     {
          start.x = sio2->_SIO2window->touch[ 0 ].x;
          start.y = sio2->_SIO2window->touch[ 0 ].y;
     }
}


void templateScreenTouchMove( void *_ptr )
{

     if( sio2->_SIO2window->n_touch )
     {
          float d1 = sio2->_SIO2window->touch[ 0 ].x - start.x;
          float d2 = sio2->_SIO2window->touch[ 0 ].y - start.y;
         
          // Get the object Suzanne located inside our resources.
          SIO2object *_SIO2object = ( SIO2object * )sio2ResourceGet( sio2->_SIO2resource,
                                                                                  SIO2_OBJECT,
                                                                                  "object/Sphere" );
          // Check if we get a pointer.
          if( _SIO2object )
          {
               // Apply a rotation based on the
               // touch movement.
               if( d1 > 5.0f || d1 < -5.0f )
               { _SIO2object->_SIO2transform->rot->z += ( d1 * 0.025f ); }
               
               if( d2 > 5.0f || d2 < -5.0f )
               { _SIO2object->_SIO2transform->rot->x += ( d2 * 0.025f ); }
               
               // Update the OpenGL matrix and apply the
               // new rotation specified above.
               sio2TransformBindMatrix( _SIO2object->_SIO2transform );
          }
     }
     
     
}