This repository has been archived on 2025-06-21. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
raylib-python-cffi/examples/models/models_yaw_pitch_roll.c
Richard Smith a703659c9d initial
2019-05-21 10:56:31 +01:00

199 lines
8.1 KiB
C

/*******************************************************************************************
*
* raylib [models] example - Plane rotations (yaw, pitch, roll)
*
* This example has been created using raylib 1.8 (www.raylib.com)
* raylib is licensed under an unmodified zlib/libpng license (View raylib.h for details)
*
* Example based on Berni work on Raspberry Pi:
* http:#forum.raylib.com/index.php?p=/discussion/124/line-versus-triangle-drawing-order
*
* Copyright (c) 2017 Ramon Santamaria (@raysan5)
*
********************************************************************************************/
#include "raylib.h"
#include "raymath.h"
# Draw angle gauge controls
void DrawAngleGauge(Texture2D angleGauge, int x, int y, float angle, char title[], Color color)
#----------------------------------------------------------------------------------
# Main entry point
#----------------------------------------------------------------------------------
int main()
[
# Initialization
#--------------------------------------------------------------------------------------
const int screenWidth = 800
const int screenHeight = 450
InitWindow(screenWidth, screenHeight, "raylib [models] example - plane rotations (yaw, pitch, roll)")
Texture2D texAngleGauge = LoadTexture("resources/angle_gauge.png")
Texture2D texBackground = LoadTexture("resources/background.png")
Texture2D texPitch = LoadTexture("resources/pitch.png")
Texture2D texPlane = LoadTexture("resources/plane.png")
RenderTexture2D framebuffer = LoadRenderTexture(192, 192)
# Model loading
Model model = LoadModel("resources/plane.obj") # Load OBJ model
model.material.maps[MAP_DIFFUSE].texture = LoadTexture("resources/plane_diffuse.png") # Set map diffuse texture
GenTextureMipmaps(&model.material.maps[MAP_DIFFUSE].texture)
Camera camera = [ 0 ]
camera.position = (Vector3)[ 0.0, 60.0, -120.0 ]# Camera position perspective
camera.target = (Vector3)[ 0.0, 12.0, 0.0 ] # Camera looking at point
camera.up = (Vector3)[ 0.0, 1.0, 0.0 ] # Camera up vector (rotation towards target)
camera.fovy = 30.0 # Camera field-of-view Y
camera.type = CAMERA_PERSPECTIVE # Camera type
float pitch = 0.0
float roll = 0.0
float yaw = 0.0
SetTargetFPS(60)
#--------------------------------------------------------------------------------------
while (!WindowShouldClose()) # Detect window close button or ESC key
[
# Update
#----------------------------------------------------------------------------------
# Plane roll (x-axis) controls
if (IsKeyDown(KEY_LEFT)) roll += 1.0
else if (IsKeyDown(KEY_RIGHT)) roll -= 1.0
else
[
if (roll > 0.0) roll -= 0.5f
else if (roll < 0.0) roll += 0.5f
]
# Plane yaw (y-axis) controls
if (IsKeyDown(KEY_S)) yaw += 1.0
else if (IsKeyDown(KEY_A)) yaw -= 1.0
else
[
if (yaw > 0.0) yaw -= 0.5f
else if (yaw < 0.0) yaw += 0.5f
]
# Plane pitch (z-axis) controls
if (IsKeyDown(KEY_DOWN)) pitch += 0.6f
else if (IsKeyDown(KEY_UP)) pitch -= 0.6f
else
[
if (pitch > 0.3f) pitch -= 0.3f
else if (pitch < -0.3f) pitch += 0.3f
]
# Wraps the phase of an angle to fit between -180 and +180 degrees
int pitchOffset = pitch
while (pitchOffset > 180) pitchOffset -= 360
while (pitchOffset < -180) pitchOffset += 360
pitchOffset *= 10
Matrix transform = MatrixIdentity()
transform = MatrixMultiply(transform, MatrixRotateZ(DEG2RAD*roll))
transform = MatrixMultiply(transform, MatrixRotateX(DEG2RAD*pitch))
transform = MatrixMultiply(transform, MatrixRotateY(DEG2RAD*yaw))
model.transform = transform
#----------------------------------------------------------------------------------
# Draw
#----------------------------------------------------------------------------------
BeginDrawing()
ClearBackground(RAYWHITE)
# Draw framebuffer texture (Ahrs Display)
int centerX = framebuffer.texture.width/2
int centerY = framebuffer.texture.height/2
float scaleFactor = 0.5f
BeginTextureMode(framebuffer)
BeginBlendMode(BLEND_ALPHA)
DrawTexturePro(texBackground, (Rectangle)[ 0, 0, texBackground.width, texBackground.height ],
(Rectangle)[ centerX, centerY, texBackground.width*scaleFactor, texBackground.height*scaleFactor],
(Vector2)[ texBackground.width/2*scaleFactor, texBackground.height/2*scaleFactor + pitchOffset*scaleFactor ], roll, WHITE)
DrawTexturePro(texPitch, (Rectangle)[ 0, 0, texPitch.width, texPitch.height ],
(Rectangle)[ centerX, centerY, texPitch.width*scaleFactor, texPitch.height*scaleFactor ],
(Vector2)[ texPitch.width/2*scaleFactor, texPitch.height/2*scaleFactor + pitchOffset*scaleFactor ], roll, WHITE)
DrawTexturePro(texPlane, (Rectangle)[ 0, 0, texPlane.width, texPlane.height ],
(Rectangle)[ centerX, centerY, texPlane.width*scaleFactor, texPlane.height*scaleFactor ],
(Vector2)[ texPlane.width/2*scaleFactor, texPlane.height/2*scaleFactor ], 0, WHITE)
EndBlendMode()
EndTextureMode()
# Draw 3D model (recomended to draw 3D always before 2D)
BeginMode3D(camera)
DrawModel(model, (Vector3)[ 0, 6.0, 0 ], 1.0, WHITE) # Draw 3d model with texture
DrawGrid(10, 10.0)
EndMode3D()
# Draw 2D GUI stuff
DrawAngleGauge(texAngleGauge, 80, 70, roll, "roll", RED)
DrawAngleGauge(texAngleGauge, 190, 70, pitch, "pitch", GREEN)
DrawAngleGauge(texAngleGauge, 300, 70, yaw, "yaw", SKYBLUE)
DrawRectangle(30, 360, 260, 70, Fade(SKYBLUE, 0.5f))
DrawRectangleLines(30, 360, 260, 70, Fade(DARKBLUE, 0.5f))
DrawText("Pitch controlled with: KEY_UP / KEY_DOWN", 40, 370, 10, DARKGRAY)
DrawText("Roll controlled with: KEY_LEFT / KEY_RIGHT", 40, 390, 10, DARKGRAY)
DrawText("Yaw controlled with: KEY_A / KEY_S", 40, 410, 10, DARKGRAY)
# Draw framebuffer texture
DrawTextureRec(framebuffer.texture, (Rectangle)[ 0, 0, framebuffer.texture.width, -framebuffer.texture.height ],
(Vector2)[ screenWidth - framebuffer.texture.width - 20, 20 ], Fade(WHITE, 0.8f))
DrawRectangleLines(screenWidth - framebuffer.texture.width - 20, 20, framebuffer.texture.width, framebuffer.texture.height, DARKGRAY)
EndDrawing()
#----------------------------------------------------------------------------------
]
# De-Initialization
#--------------------------------------------------------------------------------------
# Unload all loaded data
UnloadModel(model)
UnloadRenderTexture(framebuffer)
UnloadTexture(texAngleGauge)
UnloadTexture(texBackground)
UnloadTexture(texPitch)
UnloadTexture(texPlane)
CloseWindow() # Close window and OpenGL context
#--------------------------------------------------------------------------------------
return 0
]
# Draw angle gauge controls
void DrawAngleGauge(Texture2D angleGauge, int x, int y, float angle, char title[], Color color)
[
Rectangle srcRec = [ 0, 0, angleGauge.width, angleGauge.height ]
Rectangle dstRec = [ x, y, angleGauge.width, angleGauge.height ]
Vector2 origin = [ angleGauge.width/2, angleGauge.height/2]
int textSize = 20
DrawTexturePro(angleGauge, srcRec, dstRec, origin, angle, color)
DrawText(FormatText("%5.1f", angle), x - MeasureText(FormatText("%5.1f", angle), textSize) / 2, y + 10, textSize, DARKGRAY)
DrawText(title, x - MeasureText(title, textSize) / 2, y + 60, textSize, DARKGRAY)
]