Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SFML OpenGL - Sześcian - face pod kursorem

Ostatnio zmodyfikowano 2026-05-03 08:20
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
SFML OpenGL - Sześcian - face pod kursorem
» 2026-04-24 20:28:41
Cześć. Piszę program w SFML 3.0.2 z wykorzystaniem OpenGL. Udało mi się wygenerować sześcian. Chciałbym teraz podświetlić ścianę na która wskazuje kursor. Chodzi mi o wyznaczanie trójkąta, bo planuję wykorzystać ten algorytm również do zaznaczania płaskich sześciokątów.  

Mam taki kod na mesh i model



Mesh3D
C/C++
#include "Mesh3D.hpp"
#include <SFML/OpenGL.hpp>
#include "Window.hpp"
#include <iostream>
#include "Cursor.hpp"

Mesh3D::Mesh3D() {
   
}

Mesh3D::~Mesh3D() {
   
}

void Mesh3D::setTexture( std::shared_ptr < Texture > texture ) {
   
_texture = texture;
}

void Mesh3D::draw( float x, float y, float z, float rx, float ry, float rz ) {
   
   
glPushMatrix();
   
   
glTranslatef( x, y, z );
   
glRotatef( rx, 1.f, 0.f, 0.f );
   
glRotatef( ry, 0.f, 1.f, 0.f );
   
glRotatef( rz, 0.f, 0.f, 1.f );
   
   
glEnable( GL_TEXTURE_2D );
   
glColor3f( 1.0f, 1.0f, 1.0f );
   
glBindTexture( GL_TEXTURE_2D, _texture ? _texture->_texture->getNativeHandle()
        :
0 );
   
   
glBegin( GL_TRIANGLES );
   
   
for( auto & vertex: _vertices ) {
       
       
glNormal3f( vertex._nx, vertex._ny, vertex._nz );
       
glTexCoord2f( vertex._u, 1.0f - vertex._v );
       
glVertex3f( vertex._x, vertex._y, vertex._z );
       
   
}
   
   
glEnd();
   
   
glBindTexture( GL_TEXTURE_2D, 0 );
   
   
glPopMatrix();
}

std::shared_ptr < Mesh3D > generateCube( float size ) {
   
std::shared_ptr < Mesh3D > cube = std::make_shared < Mesh3D >();
   
// Front face
   
cube->_vertices.emplace_back( - size, - size, size, 0.f, 0.f, 1.f, 0.f, 0.f );
   
cube->_vertices.emplace_back( size, - size, size, 0.f, 0.f, 1.f, 1.f, 0.f );
   
cube->_vertices.emplace_back( size, size, size, 0.f, 0.f, 1.f, 1.f, 1.f );
   
cube->_vertices.emplace_back( - size, - size, size, 0.f, 0.f, 1.f, 0.f, 0.f );
   
cube->_vertices.emplace_back( size, size, size, 0.f, 0.f, 1.f, 1.f, 1.f );
   
cube->_vertices.emplace_back( - size, size, size, 0.f, 0.f, 1.f, 0.f, 1.f );
   
// Back face
   
cube->_vertices.emplace_back( - size, - size, - size, 0.f, 0.f, - 1.f, 1.f, 0.f );
   
cube->_vertices.emplace_back( size, - size, - size, 0.f, 0.f, - 1.f, 0.f, 0.f );
   
cube->_vertices.emplace_back( size, size, - size, 0.f, 0.f, - 1.f, 0.f, 1.f );
   
cube->_vertices.emplace_back( - size, - size, - size, 0.f, 0.f, - 1.f, 1.f, 0.f );
   
cube->_vertices.emplace_back( size, size, - size, 0.f, 0.f, - 1.f, 0.f, 1.f );
   
cube->_vertices.emplace_back( - size, size, - size, 0.f, 0.f, - 1.f, 1.f, 1.f );
   
// Left face
   
cube->_vertices.emplace_back( - size, - size, - size, - 1., 0., 0., 0., 0. );
   
cube->_vertices.emplace_back( - size, - size, size, - 1., 0., 0., 1., 0. );
   
cube->_vertices.emplace_back( - size, size, size, - 1., 0., 0., 1., 1. );
   
cube->_vertices.emplace_back( - size, - size, - size, - 1., 0., 0., 0., 0. );
   
cube->_vertices.emplace_back( - size, size, size, - 1., 0., 0., 1., 1. );
   
cube->_vertices.emplace_back( - size, size, - size, - 1., 0., 0., 0., 1. );
   
// Right face
   
cube->_vertices.emplace_back( size, - size, - size, 1., 0., 0., 1., 0. );
   
cube->_vertices.emplace_back( size, - size, size, 1., 0., 0., 0., 0. );
   
cube->_vertices.emplace_back( size, size, size, 1., 0., 0., 0., 1. );
   
cube->_vertices.emplace_back( size, - size, - size, 1., 0., 0., 1., 0. );
   
cube->_vertices.emplace_back( size, size, size, 1., 0., 0., 0., 1. );
   
cube->_vertices.emplace_back( size, size, - size, 1., 0., 0., 1., 1. );
   
// Top face
   
cube->_vertices.emplace_back( - size, size, - size, 0., 1., 0., 0., 1. );
   
cube->_vertices.emplace_back( - size, size, size, 0., 1., 0., 0., 0. );
   
cube->_vertices.emplace_back( size, size, size, 0., 1., 0., 1., 0. );
   
cube->_vertices.emplace_back( - size, size, - size, 0., 1., 0., 0., 1. );
   
cube->_vertices.emplace_back( size, size, size, 0., 1., 0., 1., 0. );
   
cube->_vertices.emplace_back( size, size, - size, 0., 1., 0., 1., 1. );
   
// Bottom face
   
cube->_vertices.emplace_back( - size, - size, - size, 0., - 1., 0., 1., 1. );
   
cube->_vertices.emplace_back( - size, - size, size, 0., - 1., 0., 1., 0. );
   
cube->_vertices.emplace_back( size, - size, size, 0., - 1., 0., 0., 0. );
   
cube->_vertices.emplace_back( - size, - size, - size, 0., - 1., 0., 1., 1. );
   
cube->_vertices.emplace_back( size, - size, size, 0., - 1., 0., 0., 0. );
   
cube->_vertices.emplace_back( size, - size, - size, 0., - 1., 0., 0., 1. );
   
   
return cube;
}


Model3D
C/C++
#include "Model3D.hpp"

Model3D::Model3D( float x, float y, float z, float rx, float ry, float rz ) {
   
   
_x = x;
   
_y = y;
   
_z = z;
   
   
_rx = rx;
   
_ry = ry;
   
_rz = rz;
   
   
_meshes.clear();
   
std::shared_ptr < Mesh3D > cubeMesh = generateCube( 0.5f );
   
cubeMesh->setTexture( getTexture( L"tex\\logo.png" ) );
   
_meshes.push_back( cubeMesh );
}

Model3D::~Model3D() {
   
}

void Model3D::draw() {
   
for( auto & mesh: _meshes ) {
       
mesh->draw( _x, _y, _z, _rx, _ry, _rz );
   
}
}
P-184095
DejaVu
» 2026-04-24 22:18:32
Moje doświadczenia z SFML mówią, że nie chcesz się pchać w 3D. Z tego co pamiętam to sf::Transform itp jest zrobione w taki sposób, że oś Z jest całkowicie wycięta z obliczeń i w zasadzie nie możesz z tych tooli korzystać gdy zaczynasz obracać scenę itd, więc... sporo rzeczy staje się bezużytecznych. Chyba, że zmienili to w wersji 3.x?

Co do wskazywania myszką na obiekt w 3D - chyba szukasz techniki zwanej 'raycast'.
P-184096
tBane
Temat założony przez niniejszego użytkownika
» 2026-04-24 22:22:44
Dzięki za odpowiedź. :-) Poszukam w necie informacji o raycast. Skoro nie SFML to w takim razie jak pracować z OpenGL albo w czym robić 3D. - nie chce silników typu Unreal engine, Unity czy GODOT, tylko samemu pisać kod od podstaw?
P-184097
DejaVu
» 2026-04-25 09:06:12
Też miałem ten problem z 3D i C++. Myślę, że do wyboru masz Irrlicht lub Ogre 3D z bibliotek, które pamiętam, ale może coś nowszego/lepszego się pojawiło co nadal nie wymaga zewnętrznych tooli.

/edit: ChatGPT 5.5
Jeśli kryterium to utrzymywane, w miarę nowoczesne i z API bardziej C++ niż C-style, to zawęziłbym listę do kilku opcji.

Najlepsze kandydaty
Wybór Ocena Dlaczego
Diligent Engine ★★★★★ Najbardziej pasuje do “nowoczesne C++ + utrzymywane + bez pełnego game engine”. Ma wspólny front-end API dla D3D12, Vulkan, Metal, WebGPU, D3D11, OpenGL/GLES/WebGL, używa HLSL jako uniwersalnego języka shaderów i jest na Apache 2.0.
Magnum ★★★★☆ Bardzo “C++-owe”, modularne, lekkie middleware do grafiki/gier/wizualizacji. Dobre API, dużo narzędzi pomocniczych, mniej C-style niż bgfx/sokol/raylib. Bazuje głównie na OpenGL/WebGL, więc nie jest tak nowoczesne backendowo jak Diligent.
Filament ★★★★☆ Nowoczesny renderer PBR w C++, aktywnie utrzymywany przez Google, bardzo dobry wizualnie. To jednak bardziej gotowy renderer niż ogólna abstrakcja API; ma własne narzędzia asset/material, np. matc, więc nie jest “zero dodatkowego toolingu”.
VulkanSceneGraph ★★★★☆ Nowoczesny C++17 scene graph na Vulkanie. Dobry, jeśli akceptujesz Vulkan jako główną ścieżkę. Mniej uniwersalny niż Diligent, ale bardziej C++-owy niż bgfx.
OGRE Next / Ogre3D ★★★☆☆ Utrzymywany, MIT, wyższy poziom abstrakcji: scena, materiały, zasoby. Bardziej “rendering engine” niż biblioteka. API i architektura mają długą historię, więc nie wszędzie będzie czuć nowoczesny C++.
Co bym odrzucił przy Twoim doprecyzowaniu

bgfx jest utrzymywany i bardzo praktyczny, ale API jest raczej low-level / C-like. To świetna warstwa renderująca, ale nie spełnia dobrze warunku “nie C-style”. Oficjalnie pozycjonuje się jako “Bring Your Own Engine/Framework”, czyli bardziej backend renderingu niż wygodne C++ middleware.

sokol_gfx i raylib też bym odrzucił w tym kontekście. Są proste i praktyczne, ale API jest C-style. raylib-cpp istnieje, ale to wrapper, nie natywnie zaprojektowane nowoczesne C++ API.

Irrlicht raczej odpada jako “nowoczesne”. Jest prosty, ale technologicznie legacy.

Moja rekomendacja praktyczna

Dla nowego projektu w C++ wybrałbym:

Diligent Engine — jeśli chcesz nowoczesny renderer/backend abstraction i potencjalnie Windows/Linux/macOS/Web/mobile.
Magnum — jeśli priorytetem jest czyste, przyjemne C++ API i modularność, a OpenGL/WebGL Ci wystarcza.
Filament — jeśli chcesz gotowy, wysokiej jakości PBR renderer i nie chcesz pisać własnego systemu materiałów/renderingu.
VulkanSceneGraph — jeśli projekt ma być Vulkan-first i raczej visualization/CAD/scena niż klasyczny game engine.

Moim zdaniem najbezpieczniejszy wybór “produkcyjny, nowoczesny, nie C-style” to Diligent Engine. Najprzyjemniejszy “C++-owy” wybór do własnego kodu to Magnum.
P-184098
tBane
Temat założony przez niniejszego użytkownika
» 2026-04-25 14:04:11
Irrlicht odpada bo nie ma okienka do zapisywania pliku - jest tylko do wczytania i nie da się tego obejść.
P-184099
tBane
Temat założony przez niniejszego użytkownika
» 2026-04-25 16:53:09
Ten Magnum wydaje się interesujący, ma wczytywaqnie modeli obj, fbx (dużo assetów z assetstore :-)), ray cast hit, ale nie wiem czy wczyta animacje.
P-184100
skovv
» 2026-04-25 21:38:33
z doświadczenia wiem że lepiej pisać w glfw i innych bibliotek z zestawu gl zamiast korzystać z sfml.. jeśli już musi być jakaś biblioteka to już lepszy będzie sdl + opengl o ile mi wiadomo.
P-184101
tBane
Temat założony przez niniejszego użytkownika
» 2026-05-03 08:20:02
znalazłem rozwiązanie :-)
biblioteka glu.h i funkcje glLoadName(int id) oraz glRenderMode(GL_RENDER)

P-184120
« 1 »
  Strona 1 z 1