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

SFML OpenGL - Sześcian - face pod kursorem

Ostatnio zmodyfikowano wczoraj o godz. 22:33
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
« 1 »
  Strona 1 z 1