Nikola Petrovic
Nikola Petrovic

Reputation: 1

How to make 3D triangle with thickness in Raylib

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

Answers (1)

Tecelli Akıntuğ
Tecelli Akıntuğ

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. Gif of triangular prism

Upvotes: 1

Related Questions