| 
| 
 | Вопрос # 3 288/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!Хочется сделать что то типа 3D пазла. Это когда пазл собирается не на плоских фишках, а на кубиках. На каждой грани есть свой кусок картинки и передвигаются они(кубики) по полю как в пятнашках(есть одно свободное поле и туда перекатывается кубик, показывая соответственно свою другую грань).
 Так вот, в чем вопрос:
 Пока хочу узнать, как порезать картинку что бы они(порезанные кусочки) были отдельными объектами и их можно было переворачивать и двигать и где то сохранять?
 Какие есть варианты?
 
 Написал сюда, потому что хочу реализовать на Delphi
 
|  |   Вопрос задал: Irbis (статус: Посетитель)Вопрос отправлен: 15 октября 2009, 10:43
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Ну, если чисто теоретически, то я бы начал с разработки таких объектов, как:1. Грань куба. Содержит фрагмент изображения типа TBitmap и отвечает за его отрисовку на экране.
 2. Куб. Содержит массив из 6 граней, отвечает за их отрисовку, вращение и за своё перемещение.
 3. Игровое пространство. Содержит массив кубов, отвечает за их отрисовку внутри себя, перемешивание/передвижение/вращение этих кубов мышью/клавой и логику.
 Ну вот примерно такая абстракция.
 
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 15 октября 2009, 11:08
 
 |  
 Мини-форум вопросаВсего сообщений: 4; последнее сообщение — 15 октября 2009, 13:20; участников в обсуждении: 3. 
|   | Вадим К (статус: Академик), 15 октября 2009, 11:23 [#1]:что бы скопировать кусочек картинки с одного Image в другой (да и между TBitmap'ами так можно), можно воспользоваться функцией CopyRect. Ну где то так 
   Image2.Canvas.CopyRect(
    Rect(0,0,Image2.Width,Image2.Height),
    Image1.Canvas,
    Rect(
      0,
      0,
      Image1.Picture.Width-50,
      Image1.Picture.Height-50));А вот если нарисовать кубики хочется - прямая дорога до OpenGl (это проще) или DirectX (чуть сложнее) или прямо на GDI ваять (школьного курса геометрии и алгебры может не хватить).Галочка "подтверждения прочтения" - вселенское зло. |  
|   | AlexMPEI (статус: 1-ый класс), 15 октября 2009, 12:44 [#2]:конечно OpenGL! 
 procedure DrawCube(size: GLfloat);
 begin
 glBegin(GL_QUADS);
 // левая грань
 glVertex3f( -size / 2, -size / 2, -size / 2);
 glVertex3f( -size / 2,  size / 2, -size / 2);
 glVertex3f( -size / 2,  size / 2,  size / 2);
 glVertex3f( -size / 2, -size / 2,  size / 2);
 // правая грань
 glVertex3f(  size / 2, -size / 2, -size / 2);
 glVertex3f(  size / 2, -size / 2,  size / 2);
 glVertex3f(  size / 2,  size / 2,  size / 2);
 glVertex3f(  size / 2,  size / 2, -size / 2);
 // нижняя грань
 glVertex3f( -size / 2, -size / 2, -size / 2);
 glVertex3f( -size / 2, -size / 2,  size / 2);
 glVertex3f(  size / 2, -size / 2,  size / 2);
 glVertex3f(  size / 2, -size / 2, -size / 2);
 // верхняя грань
 glVertex3f( -size / 2, size / 2, -size / 2);
 glVertex3f( -size / 2, size / 2,  size / 2);
 glVertex3f(  size / 2, size / 2,  size / 2);
 glVertex3f(  size / 2, size / 2, -size / 2);
 // задняя грань
 glVertex3f( -size / 2, -size / 2, -size / 2);
 glVertex3f(  size / 2, -size / 2, -size / 2);
 glVertex3f(  size / 2,  size / 2, -size / 2);
 glVertex3f( -size / 2,  size / 2, -size / 2);
 // передняя грань
 glVertex3f( -size / 2, -size / 2,  size / 2);
 glVertex3f(  size / 2, -size / 2,  size / 2);
 glVertex3f(  size / 2,  size / 2,  size / 2);
 glVertex3f( -size / 2,  size / 2,  size / 2);
 glEnd();
 end;
 
 вот и 3х мерный куб нужного размера готов. обтянуть текстурами столь же просто. только нарезай и натягивай. вращение тоже несложно.
 http://www.odelphi.ru/grafika-opengl/213-tekstury.html тут про то как обтянуть текстурой довольно подробно написано.
 |  
|   | Вадим К (статус: Академик), 15 октября 2009, 13:08 [#3]:  )) привести такую пачку кода... Если уж изучать OpenGl, то лучше поискать книжку Краснова http://www.ozon.ru/context/detail/id/96905/ . И дискетку к ней. Там есть всё, что надо для старта.
 Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Irbis (статус: Посетитель), 15 октября 2009, 13:20 [#4]:Всем большое спасибо, кто откликнулся! Есть пища для размышления, буду работать
 |  15 октября 2009, 22:12: Вопрос перемещён из тематического раздела Delphi » Алгоритмы, преобразования в раздел Delphi » Графика (2D и 3D) в приложениях модератором Ерёмин А.А. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |