2.2 C
New York
Tuesday, March 19, 2024

Mastering Flock Simulation with Boids, C++, OpenGL and ImGui ???? | by Thomas Rouch | Sep, 2023

Photograph by Shubham Dhage on Unsplash


OpenGL is a superb alternative for growing a C++ utility to animate boids as a consequence of its versatility and high-performance capabilities.

OpenGL (Open Graphics Library) is a cross-platform, open-source graphics API that facilitates GPU-accelerated rendering and permits builders to effectively create interactive 2D and 3D graphics inside their purposes.

GLFW, which stands for “Graphics Library FrameWork,” is commonly used with OpenGL to simplify window creation, consumer enter dealing with, and context administration, making it a well-liked alternative for a lot of OpenGL initiatives. Various libraries like SDL, FreeGLUT, and SFML will also be used relying on the particular necessities of your OpenGL undertaking.

You possibly can set up each OpenGL and GLFW utilizing the next command:
apt-get set up libgl1-mesa-dev libglfw3-dev

Expensive ImGui

Expensive ImGui, or “Quick Mode Graphical Consumer Interface,” is a light-weight and environment friendly library for creating dynamic consumer interfaces in real-time purposes. It’s particularly common in recreation improvement and different initiatives requiring versatile in-app interfaces.

The display seize under illustrates how the Expensive ImGui interface easily blends with the OpenGL utility.

Expensive ImGui interface — Display seize by the writer

The core of Expensive ImGui is self-contained inside a couple of platform-agnostic information which you’ll simply compile in your utility/engine. They’re all of the information within the root folder of the repository (imgui*.cpp, imgui*.h).

No particular construct course of is required. You possibly can add the .cpp information into your present undertaking. Backends for a wide range of graphics API and rendering platforms are offered within the backends/folder.

Including ImGui with opengl3 and glfw backends— Screenshots by the writer

Trackball digital camera

Utilizing Expensive ImGui permits customers to make real-time parameter changes, straight influencing the flock’s conduct on-screen. To optimize the consumer expertise, we must also provide an intuitive mouse-based management mechanism to navigate contained in the 3D setting.

A regularly chosen strategy is to implement a trackball digital camera, which permits one to rotate and zoom round a place in area that may be modified dynamically.

This digital camera is outlined by:

  • a 3D level in area that the digital camera will give attention to, i.e., some extent that may at all times be projected within the heart of the display
  • its spherical coordinates round this mounted level, i.e., two angles φ and θ and a radius r used to zoom in/out
Trackball Digital camera — Diagram by the writer

I’ve chosen the RIGHT_DOWN_FRONT digital camera conference to simply match with the mouse occasions (You too can experiment with negating the dx and dy values inside the mouse occasions to regulate navigation to your choice.).

For those who’re not aware of digital camera poses and coordinate programs, take a look at my earlier articles: Changing digital camera poses from OpenCV to OpenGL might be simple and Understanding 360 photographs ????.

Let’s have a look at the anticipated digital camera conduct earlier than really implementing it. Three coloured cubes are being rendered, and a white cross is superimposed to signify the middle, i.e., the 3D level that the digital camera is .

The rotation consists of utilizing the left-click drags to replace φ and θ. Horizontal mouse strikes replace θ, whereas vertical ones replace φ. Though θ covers a variety of 2π, whereas φ solely covers π, it makes extra sense to deal with horizontal and vertical mouse actions with equal affect when adjusting these angles.

Rotation — Display Recording by the writer

The zoom consists of shrinking or growing the radius r.

Zoom — Display Recording by the writer

The middle shift makes use of the right-click drag to translate the middle place alongside the fronto-parallel aircraft.

Heart shift — Display Recording by the writer

Right here’s the header of the TrackballCamera class.

The compute_axes methodology returns the present digital camera’s proper, down, and entrance axes. Observe that we have to flip the vector given by the spherical angles φ and θ to acquire the entrance vector because the digital camera is trying towards the middle.

For the reason that entrance vector isn’t essentially orthogonal to the up vector aligned with the gravity, the cross-product hack is required to acquire an orthonormal foundation, with an up vector mendacity inside the vertical aircraft.

Assuming the mouse drags dx and dy have been scaled inside [-1,1], we are able to use them to replace the digital camera parameters, as defined beforehand. The signed zoom_input is the variety of mouse scrolls.

Lastly, we are able to outline the OpenGL mannequin view matrix by a distance r from the heart.

Boid drawing

When rendering objects with OpenGL, it’s typically helpful to mix primary geometric primitives like vertices, edges, and faces with matrix transformations. This strategy permits us to outline these primitives inside their native coordinate programs, basically their remoted areas. We will then apply matrix transformations to those native primitives to translate, rotate, or scale them inside the international scene.

It will be extremely tedious and impractical to outline each primitive, akin to vertices of a 3D mannequin, in a world coordinate area.

The glPushMatrix/glPopMatrix strategies can help you isolate transformations and keep away from cumulative results by saving a checkpoint for the present matrix state.

Let’s create a easy illustration of a boid by rendering a skinny coloured field as its physique and a yellow pyramid to depict its beak.

Boids Drawing — Display Seize by the writer

First, we should apply a remodel to align the X-axis with the boids orientation. This may be achieved by first translating to the boid place after which rotating across the cross product between the X-axis and the velocity vector. Observe that to compute the angle θ between two vectors, which is inside [0, π], it’s extra strong to make use of atan2 than straight the acos methodology.

The draw_box and draw_pyramid strategies outline the vertices to hyperlink collectively.

Remaining OpenGL Script

Right here’s the ultimate script to run the OpenGL app utilizing GLFW, Expensive Imgui, and our customized Trackball Digital camera. For the sake of readability, the mouse callbacks are outlined in a second snippet.

There’s a placeholder TODO line within the rendering loop so as to add the boids replace and rendering.

We create a GLFW context, adopted by a Expensive Imgui context. Then, so long as the window is open, new frames are created and rendered at 30 FPS.

Whereas the Mannequin View matrix is up to date by the lookAt methodology of the TrackballCamera, the Projection matrix is continually adjusted to match the present window measurement.

Expensive ImGui permits us to replace a float and an integer utilizing sliders.

Listed here are the mouse callbacks, calling the zoom , rotate and shift_center strategies of the TrackballCamera.

I hope you loved studying this text and that it provides you extra insights on the way to animate boids utilizing Expensive ImGui!

Click on right here to go to my GitHub repository.

Supply hyperlink

Related Articles


Please enter your comment!
Please enter your name here

Latest Articles