Reputation: 1
I can make a 3D triangle in Raylib, but now I want that triangle to have thickness.
How can this be accomplished with Raylib?
Here is code in C# that shows only one triangle with no thickness:
using System;
using Raylib_cs;
using System.Numerics;
namespace Triangle
{
class Program
{
static void Main(string[] args)
{
Raylib.InitWindow(800, 480, "Hello World");
Camera3D camera;
camera.position = new Vector3(10.0f, 10.0f, 10.0f); // Camera3D position
camera.target = new Vector3(0.0f, 0.0f, 0.0f); // Camera3D looking at point
camera.up = new Vector3(0.0f, 1.0f, 0.0f); // Camera3D up vector (rotation towards target)
camera.fovy = 120.0f; // Camera3D field-of-view Y
camera.type = CameraType.CAMERA_PERSPECTIVE; // Camera3D mode type
Vector3 point1 = new Vector3(0.0f, 0.0f, 0.0f);
Vector3 point2 = new Vector3(10.0f, 0.0f, 0.0f);
Vector3 point3 = new Vector3(10.0f, 10.0f, 0.0f);
Raylib.SetCameraMode(camera, CameraMode.CAMERA_FREE); // Set a free camera mode
Raylib.SetTargetFPS(60);
Rlgl.rlDisableBackfaceCulling();
while (!Raylib.WindowShouldClose())
{
Raylib.UpdateCamera(ref camera);
Raylib.BeginDrawing();
Raylib.ClearBackground(Color.RAYWHITE);
Raylib.BeginMode3D(camera);
Raylib.DrawTriangle3D(point1, point2, point3, Color.BLACK);
Raylib.EndMode3D();
//text
Raylib.DrawRectangle(10, 10, 320, 133, Raylib.ColorAlpha(Color.SKYBLUE, 0.5f));
Raylib.DrawRectangleLines(10, 10, 320, 133, Color.BLUE);
Raylib.DrawText("Free camera default controls:", 20, 20, 10, Color.BLACK);
Raylib.DrawText("- Mouse Wheel to Zoom in-out", 40, 40, 10, Color.DARKGRAY);
Raylib.DrawText("- Mouse Wheel Pressed to Pan", 40, 60, 10, Color.DARKGRAY);
Raylib.DrawText("- Alt + Mouse Wheel Pressed to Rotate", 40, 80, 10, Color.DARKGRAY);
Raylib.DrawText("- Alt + Ctrl + Mouse Wheel Pressed for Smooth Zoom", 40, 100, 10, Color.DARKGRAY);
Raylib.EndDrawing();
}
Raylib.CloseWindow();
}
}
}
If anyone has some idea how this can be accomplished I would greatly appreciate it.
Upvotes: 0
Views: 958
Reputation: 101
I'm not quite sure what you mean by 3D triangle but I'm assuming you mean triangular prism. To do this you would need to draw each face explicitly. To draw the rectangular sides you would need to draw two triangles. Also since we are only using the front faces of the triangles we don't need to disable backface culling. When drawing the triangles the points need to be arranged so that when looking at the face the points go in clockwise order.
Here's the C++ implementation but it should give you the idea;
Camera3D camera;
camera.position = (Vector3){10.0f, 10.0f, 10.0f}; // Camera3D position
camera.target = (Vector3){0.0f, 0.0f, 0.0f}; // Camera3D looking at point
camera.up = (Vector3){0.0f, 1.0f, 0.0f}; // Camera3D up vector (rotation towards target)
camera.fovy = 120.0f; // Camera3D field-of-view Y
camera.type = CAMERA_PERSPECTIVE; // Camera3D mode type
Vector3 point1 = (Vector3){0.0f, 0.0f, 0.0f};
Vector3 point2 = (Vector3){10.0f, 0.0f, 0.0f};
Vector3 point3 = (Vector3){10.0f, 10.0f, 0.0f};
Vector3 thickness = (Vector3){0, 0, -5.0f};
Vector3 back1 = Vector3Add(point1, thickness);
Vector3 back2 = Vector3Add(point2, thickness);
Vector3 back3 = Vector3Add(point3, thickness);
SetCameraMode(camera, CAMERA_FREE); // Set a free camera mode
//rlDisableBackfaceCulling();
// Main game loop
while (!WindowShouldClose()) // Detect window close button or ESC key
{
// Update
//----------------------------------------------------------------------------------
// TODO: Update your variables here
//----------------------------------------------------------------------------------
// Draw
//----------------------------------------------------------------------------------
UpdateCamera(&camera);
BeginDrawing();
ClearBackground(RAYWHITE);
BeginMode3D(camera);
// Front face
DrawTriangle3D(point1, point2, point3, BLACK);
// Back face
DrawTriangle3D(back3, back2, back1, BLACK);
// Slanted side
DrawTriangle3D(back1, point1, back3, BLACK);
DrawTriangle3D(point1, point3, back3, BLACK);
// Back side
DrawTriangle3D(point2, back2, back3, BLACK);
DrawTriangle3D(back3, point3, point2, BLACK);
// Bottom side
DrawTriangle3D(back1, back2, point2, BLACK);
DrawTriangle3D(point2, point1, back1, BLACK);
DrawGrid(100, 10.0);
EndMode3D();
EndDrawing();
//----------------------------------------------------------------------------------
}
Here's how that looks in orbital mode.
Upvotes: 1