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#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 >(); 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 ); 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 ); 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. ); 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. ); 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. ); 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#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 ); } }
|