Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: kamil от Декабрь 01, 2014, 02:19



Название: Простейший 3d график
Отправлено: kamil от Декабрь 01, 2014, 02:19
Задача простая. Мне нужно визуализовать массив точек (x,y,z). То есть просто вывести оси, подписать их, и вывести точки. Было бы хорошо, если бы была возможность врашать график.

Что лучше всего для этого выбрать?
Всё что я нашёл это qwtplot3d, но похоже проект уже несколько лет мёртв, да и не сильно она мне понравилась.
Может есть какие-нибудь решения? Навроде QCustomPlot только с 3d?


Название: Re: Простейший 3d график
Отправлено: 8Observer8 от Декабрь 09, 2014, 09:15
Да, есть - MathGL

Вот пример использования на Qt: http://mathgl.sourceforge.net/doc_en/Using-QMathGL.html

Сам им ещё не пользовался.

Вот вам, на всякий случай, пример рисования квадрата на шейдерах. Там рисунок "Squares.png" посмотрите, когда будете разбираться

Scene.h
Код
C++ (Qt)
#ifndef SCENE_H
#define SCENE_H
 
#include <QGLWidget>
#include <QOpenGLShaderProgram>
#include <QOpenGLFunctions>
#include "Square.h"
 
class Scene : public QGLWidget, public QOpenGLFunctions
{
public:
   Scene( QWidget *parent = 0 );
 
private:
   void initializeGL();
   void paintGL();
   void resizeGL( int w, int h);
 
   void drawSquare( const Square &square );
 
   QOpenGLShaderProgram *m_program;
 
   GLint m_posAttr;
   GLint m_colAttr;
   GLint m_matrixUniform;
 
   Square m_square;
};
 
#endif // SCENE_H
 

Scene.cpp
Код
C++ (Qt)
#include <QMatrix4x4>
#include "Scene.h"
 
Scene::Scene( QWidget *parent ) :
   QGLWidget( parent ),
   m_program( 0 )
{
}
 
void Scene::initializeGL()
{
   initializeOpenGLFunctions();
   m_program = new QOpenGLShaderProgram( this );
   m_program->addShaderFromSourceFile( QOpenGLShader::Vertex, ":/Shaders/vShader.glsl" );
   m_program->addShaderFromSourceFile( QOpenGLShader::Fragment, ":/Shaders/fShader.glsl" );
   if ( !m_program->link() )
   {
       qWarning( "Error: unable to link a shader program" );
       return;
   }
   m_posAttr = m_program->attributeLocation( "posAttr" );
   m_colAttr = m_program->attributeLocation( "colAttr" );
   m_matrixUniform = m_program->uniformLocation( "matrix" );
}
 
void Scene::paintGL()
{
   glClear( GL_COLOR_BUFFER_BIT );
 
   if( !m_program->bind() )
       return;
 
   QMatrix4x4 matrix;
   matrix.ortho( -2.0f, 2.0f, -2.0f, 2.0f, 2.0f, -2.0f );
 
   glPushMatrix();
   {
       matrix.translate( 0.0f, 0.0f, -1.0f );
       m_program->setUniformValue( m_matrixUniform, matrix );
       drawSquare( m_square );
   }
   glPopMatrix();
 
   m_program->release();
}
 
void Scene::resizeGL( int w, int h )
{
   if ( h == 0 )
       h = 1;
 
   glViewport( 0, 0, w, h );
}
 
void Scene::drawSquare( const Square &square )
{
   glVertexAttribPointer( m_posAttr, 2, GL_FLOAT, GL_FALSE, 0, square.vertices.data() );
   glVertexAttribPointer( m_colAttr, 3, GL_FLOAT, GL_FALSE, 0, square.colors.data() );
 
   glEnableVertexAttribArray( m_posAttr );
   glEnableVertexAttribArray( m_colAttr );
 
   glDrawArrays( GL_TRIANGLES, 0, 6 );
 
   glDisableVertexAttribArray( m_colAttr );
   glDisableVertexAttribArray( m_posAttr );
}
 

vShader.glsl
Код
C++ (Qt)
attribute highp vec4 posAttr;
uniform highp mat4 matrix;
attribute lowp vec4 colAttr;
varying lowp vec4 col;
 
void main()
{
   col = colAttr;
   gl_Position = matrix * posAttr;
}
 

fShader.glsl
Код
C++ (Qt)
varying lowp vec4 col;
 
void main()
{
   gl_FragColor = col;
}
 


Название: Re: Простейший 3d график
Отправлено: Racheengel от Декабрь 17, 2014, 00:31

Всё что я нашёл это qwtplot3d, но похоже проект уже несколько лет мёртв

Пациент  скорее  жив, чем мертв. Посмотри обновление тут www.sintegrial.com