|
Rendering A Hot Air Balloon |
Scooter
Member #16,799
January 2018
|
Hi all: I had an idea the other day: make a hot air balloon using allegro and opengl. Do you think this would be a project a newbie could accomplish? If so, where would one begin? I have had to give up on many things because it got too difficult for me! This would be great if it could be done! Thanks for your time. |
bamccaig
Member #7,536
July 2006
|
Set the bar low to start. A hot air balloon could be as simple as a circle with a square beneath it, or a sphere and a cube if 3D. Note: Allegro doesn't really help you drawing 3D things. You need to do that with GL directly. Allegro will just initialize things for you I think. After you've got a very simple program working you can expand upon it to make it better, piece by piece. If you aim too high you won't get anything done. -- acc.js | al4anim - Allegro 4 Animation library | Allegro 5 VS/NuGet Guide | Allegro.cc Mockup | Allegro.cc <code> Tag | Allegro 4 Timer Example (w/ Semaphores) | Allegro 5 "Winpkg" (MSVC readme) | Bambot | Blog | C++ STL Container Flowchart | Castopulence Software | Check Return Values | Derail? | Is This A Discussion? Flow Chart | Filesystem Hierarchy Standard | Clean Code Talks - Global State and Singletons | How To Use Header Files | GNU/Linux (Debian, Fedora, Gentoo) | rot (rot13, rot47, rotN) | Streaming |
Scooter
Member #16,799
January 2018
|
Hi bamccaig: Great idea! If I start with a sphere, bring the bottom of the sphere down, narrow it a bit I would have the shape I need. Is there a way to do such a thing in opengl? Just a thought. Thanks |
bamccaig
Member #7,536
July 2006
|
I'm afraid OpenGL is far too complicated to learn it from questions and answers on a messaging board. If you don't know it yet you're going to have to learn it first. Put the hot air balloon idea on a shelf, and start by completing an OpenGL tutorial or two. Once you've got a simple program running you can try Googling for things that you think you'll need for the hot air balloon, and try to figure out how to do it. If you have trouble getting something to work you can post here, but don't expect us to do your homework for you. That's not how the Internet works. I can't help anyway because I myself haven't gone past the tutorial step. -- acc.js | al4anim - Allegro 4 Animation library | Allegro 5 VS/NuGet Guide | Allegro.cc Mockup | Allegro.cc <code> Tag | Allegro 4 Timer Example (w/ Semaphores) | Allegro 5 "Winpkg" (MSVC readme) | Bambot | Blog | C++ STL Container Flowchart | Castopulence Software | Check Return Values | Derail? | Is This A Discussion? Flow Chart | Filesystem Hierarchy Standard | Clean Code Talks - Global State and Singletons | How To Use Header Files | GNU/Linux (Debian, Fedora, Gentoo) | rot (rot13, rot47, rotN) | Streaming |
Scooter
Member #16,799
January 2018
|
Hi bamccaig: Sorry, didn't mean to upset you! Have a great day! |
bamccaig
Member #7,536
July 2006
|
I'm not upset. I'm just trying to steer you in the right direction. -- acc.js | al4anim - Allegro 4 Animation library | Allegro 5 VS/NuGet Guide | Allegro.cc Mockup | Allegro.cc <code> Tag | Allegro 4 Timer Example (w/ Semaphores) | Allegro 5 "Winpkg" (MSVC readme) | Bambot | Blog | C++ STL Container Flowchart | Castopulence Software | Check Return Values | Derail? | Is This A Discussion? Flow Chart | Filesystem Hierarchy Standard | Clean Code Talks - Global State and Singletons | How To Use Header Files | GNU/Linux (Debian, Fedora, Gentoo) | rot (rot13, rot47, rotN) | Streaming |
Edgar Reynaldo
Major Reynaldo
May 2007
|
Step 1) Decide the technical requirements of what you want to do. For instance, here's a hot air balloon I drew by accident. Allegro is more than capable of drawing a balloon as a polygon, a set of lines, etc... You don't specifically need to know OpenGL to do it. http://members.allegro.cc/EdgarReynaldo/previews/Spiraloid/Balloon1.html {"name":"Balloon1.png","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/d\/c\/dca6d415a73ea6eb425fd585553435af.png","w":1024,"h":768,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/d\/c\/dca6d415a73ea6eb425fd585553435af"} EDIT Once you have that, you can try to texture it. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
Scooter
Member #16,799
January 2018
|
Hi Edgar: Thanks for the reply. It has been awhile, hope all is well! I have downloaded 2 files: balloon.jpg and section.png. The balloon file will show you what I am trying to duplicate. There are 10 sections to the balloon. The section file shows one of the 10 sections without the birds. My problem is the section has to be fitted to the balloon shape. That is my problem. What is the best way to do this? If you have any questions let me know. Thanks! |
Edgar Reynaldo
Major Reynaldo
May 2007
|
Are you planning on a 2D balloon or a 3D one? You need the vertices, and the texture coordinates. From something like an .obj or some kind of model file. Then you can draw with allegro or opengl. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
Scooter
Member #16,799
January 2018
|
Hi Edgar: Oh, it must be 3D in opengl! As far as the .obj file: do I need to do the balloon in Blender and then import to opengl? I hope not! Thanks! |
Edgar Reynaldo
Major Reynaldo
May 2007
|
Make the strips horizontal. Vertical will only give you pain. Break them up into a band. Take a disc and make a bracelet. The outside of the bracelet is the band which you render in opengl. You still don't need OpenGL to do this, as allegro can do it for you. hint Align it down the axis, and every band is just a circle of different radius connected to to the previous and next strip. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
MikiZX
Member #17,092
June 2019
|
I've been playing with the problem of creating a hot air balloon in code and.. well.. maybe it helps: 1#include <stdio.h>
2#include <math.h>
3#include <allegro5/allegro.h>
4#include "allegro5/allegro_primitives.h"
5#include <allegro5/allegro_opengl.h>
6#include <GL/glu.h>
7
8
9const float FPS = 60;
10
11ALLEGRO_DISPLAY *display = NULL;
12ALLEGRO_EVENT_QUEUE *event_queue = NULL;
13ALLEGRO_TIMER *timer1 = NULL;
14
15bool redraw = true;
16
17double lightangle = 0.0;
18GLUquadricObj *quadric = NULL;
19
20// isolating cleanup code in a single function because we use this code many times
21// doing this will keep the rest of the source code easier to read
22void close_and_exit()
23{
24 if (quadric) gluDeleteQuadric(quadric);
25 if (timer1) al_destroy_timer(timer1);
26 if (display) al_destroy_display(display);
27 if (event_queue) al_destroy_event_queue(event_queue);
28 al_uninstall_system();
29 exit(0);
30}
31
32// the program execution starts here with 'main' function
33int main(int argc, char **argv){
34
35 // here we initialize different parts of Allegro
36 if(!al_init()) {
37 fprintf(stderr, "failed to initialize allegro!\n");
38 return -1;
39 }
40
41 al_init_primitives_addon();
42 al_set_new_display_option(ALLEGRO_DEPTH_SIZE , ALLEGRO_DONTCARE , 16);
43 al_set_new_display_flags(ALLEGRO_OPENGL );
44 display = al_create_display(640, 480);
45 if(!display) {
46 fprintf(stderr, "failed to create display!\n");
47 close_and_exit();
48 }
49
50 if (!al_install_keyboard())
51 {
52 fprintf(stderr, "Error installing keyboard.\n");
53 close_and_exit();
54 }
55
56 event_queue = al_create_event_queue();
57 if(!event_queue) {
58 fprintf(stderr, "failed to create event_queue!\n");
59 close_and_exit();
60 }
61
62 timer1 = al_create_timer(1.0 / FPS);
63 if(!timer1) {
64 fprintf(stderr, "failed to create timer!\n");
65 close_and_exit();
66 }
67
68 al_register_event_source(event_queue, al_get_keyboard_event_source());
69
70 al_register_event_source(event_queue, al_get_display_event_source(display));
71
72 al_register_event_source(event_queue, al_get_timer_event_source(timer1));
73
74 al_start_timer(timer1);
75
76glEnable(GL_DEPTH_TEST);
77glDisable(GL_CULL_FACE);
78glEnable(GL_LIGHTING);
79quadric = gluNewQuadric();
80 while(1)
81 {
82 ALLEGRO_EVENT ev;
83 al_wait_for_event(event_queue, &ev);
84
85 if(ev.type == ALLEGRO_EVENT_TIMER) {
86 redraw = true;
87 }
88
89 if(ev.type == ALLEGRO_EVENT_KEY_DOWN) {
90
91 if (ev.keyboard.keycode==ALLEGRO_KEY_ESCAPE)
92 close_and_exit();
93 }
94
95
96 if(ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) {
97 break;
98 }
99
100 if(redraw && al_is_event_queue_empty(event_queue))
101 {
102 redraw = false;
103 al_set_target_backbuffer(display);
104 al_clear_to_color(al_map_rgb(0,50,140));
105 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
106 glMatrixMode(GL_PROJECTION);
107 glLoadIdentity();
108 gluPerspective(90.0, (GLdouble)640.0 / (GLdouble)480.0, 1.0, 2000.0);
109
110 glMatrixMode(GL_MODELVIEW);
111 glLoadIdentity();
112 gluLookAt(0.0f, 0.0f, -100.0f, 0.0f, 0.0f, 1.0f, 0.0, 1.0f, 0.0f);
113
114 GLfloat light0_pos[] = {50.0, 50.0, -50.0, 1.0};
115 GLfloat light0_color[] = {0.01, 0.01, 0.01, 0.0};
116 GLfloat light1_pos[] = {10.0, 35.0, -10.0, 1.0};
117 GLfloat light1_color[] = {1.0, 0.80, 0.65, 0.0};
118 light1_pos[0]=cos(lightangle/10.0)*4000.0;
119 light1_pos[2]=sin(lightangle/10.0)*4000.0;
120 lightangle+=0.01;
121 glLightfv( GL_LIGHT0,GL_POSITION,light0_pos);
122 glLightfv( GL_LIGHT0,GL_DIFFUSE,light1_color);
123 glLightfv( GL_LIGHT0,GL_AMBIENT,light0_color);
124 glLightfv( GL_LIGHT1,GL_POSITION,light1_pos);
125 glLightfv( GL_LIGHT1,GL_DIFFUSE,light1_color);
126 glLightfv( GL_LIGHT1,GL_AMBIENT,light1_color);
127 glEnable(GL_LIGHT0);
128 glEnable(GL_LIGHT1);
129
130 glTranslatef(0,30+cos(lightangle/10.0)*cos(lightangle/5.0)*20.0,0);
131 glRotatef(cos(lightangle)*5.0,0,2.0,0);
132 glRotatef(cos(lightangle*2.0),0,0,2.0);
133 glColor3f(1,1,0);
134 gluQuadricTexture(quadric, GL_FALSE); // halt texture coordinate generation
135 gluQuadricDrawStyle(quadric, GLU_FILL );
136 gluQuadricDrawStyle(quadric, GLU_OUTSIDE );
137 gluQuadricNormals(quadric, GL_SMOOTH);
138 gluSphere (quadric, 30.0f, 18, 18); // radius, slices, stacks
139 glRotatef(90,1,0,0);
140 glColor3f(1,1,0);
141 gluQuadricDrawStyle(quadric, GLU_LINE);
142 gluCylinder(quadric,30,10,50,12,2);
143 glTranslatef(0,0,50);
144 gluQuadricDrawStyle(quadric, GLU_FILL);
145 gluCylinder(quadric,10,8,10,12,12);
146
147 al_flip_display();
148 }
149 }
150 close_and_exit();
151}
|
MikiZX
Member #17,092
June 2019
|
Oh.. ok.. |
Edgar Reynaldo
Major Reynaldo
May 2007
|
dang, that's pretty good. Now just smooth out the sides, and you're golden. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
pmprog
Member #11,579
January 2010
|
@MikiZX: Out of curiousity, is there any reason you didn't use the Allegro 3D transform functions and primitive rendering?
|
MikiZX
Member #17,092
June 2019
|
Hm.. honestly said I was 'thinking in OpenGL' at the time and did not even think of Allegro5's transforms - I was just happy it worked. |
Edgar Reynaldo
Major Reynaldo
May 2007
|
There are 2D and 3D transformations. The 2D transformations use 3D under the hood. The projection matrix is whatever you set it to. It's all 3D under the hood. Ortho just gives you a flat space in a certain plane to work with. My Website! | EAGLE GUI Library Demos | My Deviant Art Gallery | Spiraloid Preview | A4 FontMaker | Skyline! (Missile Defense) Eagle and Allegro 5 binaries | Older Allegro 4 and 5 binaries | Allegro 5 compile guide |
|