Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Asechka от Декабрь 20, 2014, 14:45



Название: Анимация математического маятника (OpenGL)
Отправлено: Asechka от Декабрь 20, 2014, 14:45
Пытаюсь сделать анимацию маятника, но пока ничего не получается. Объясните как делать анимацию в qt с помощью OpenGL.


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: Alexu007 от Декабрь 21, 2014, 09:15
А в чём затруднение? В самом процессе рисования или в программировании координат маятника?


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: 8Observer8 от Декабрь 21, 2014, 14:21
Вот хороший пример с анимацией: C:\Qt\Qt5.4.0\Examples\Qt-5.4\opengl\qopenglwidget

Я сделал по нему ещё более простой пример. Здесь треугольник вращается вокруг оси Z: https://github.com/8Observer8/TexturedTriangle

Но это только анимация. А дальше сложнее. Нужна математика, чтобы описать, как будут меняться координаты центра шара. Для перемещения шара используйте метод:
Код
C++ (Qt)
void QMatrix4x4::​translate(float x, float y, float z)

Шар загрузите из Blender'а

P.S. Есть много путей решения задачи. Я описал, тот которым сам бы решал


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: Asechka от Декабрь 21, 2014, 14:46
Была проблема в создании самой анимации(движения). Она благополучно решилась.


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: Igors от Декабрь 21, 2014, 15:16
Была проблема в создании самой анимации(движения). Она благополучно решилась.
Полагаю с помощью ф-ций sin/cos. И если только шарик на ниточке - зачем тащить OpenGL?


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: 8Observer8 от Декабрь 21, 2014, 15:19
Хорошо. Я там усложнил к тому же. Можно сделать в 2D и без текстур, просто цвета. Вот вращение треугольника по кругу: https://github.com/8Observer8/TranslatedTriangle

(http://i9.pixs.ru/storage/8/9/1/Translated_7713172_15261891.png)

Дополнительно в примере:
- Треугольник можно приближать и отдалять с помощью колёсика мыши
- Вращать с помощь зажатой левой кноки мыши (конечно, для 2D это нужно отключить)

Правда, я в замешательстве, как круг нарисовать с помощью треугольников. Алгоритм нужен

Ещё нужна математика, чтобы движения треугольника (для круга будет тоже самое и для шара тоже) замедлялось у границ, ускорялось внизу и затухало

Если есть проект, то скиньте, пожалуйста, ссылку


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: 8Observer8 от Декабрь 21, 2014, 15:38
А можете мне помочь уже в другом вопросе? Я делаю таблицу QTableWidget. Не получается взять данные из ячейки и сделать так чтобы таблица реагировала на ввод с клавиатуры
Используйте QTableView. Он удобнее

Надеюсь, вам пригодится мой пример: https://github.com/8Observer8/PointsOnCoordinatePlane

(http://i9.pixs.ru/storage/2/5/3/Plotpng_3149755_15262253.png)


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: 8Observer8 от Декабрь 21, 2014, 15:47
График нарисован с помощью библиотеки QCustomPlot: http://www.qcustomplot.com/

Из примера выше можно почерпнуть, как с таблицей работать


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: Asechka от Декабрь 21, 2014, 15:48
Спасибо. Но все таки хотелось бы сделать QTableWidget.


QTableWidgetItem *item = new QTableWidgetItem();
    for(int row = 0; row < ui->tableWidget->rowCount(); row++)
      for(int column = 0; column < 1; column++)
      {
          l=item->text();
      }
......
for(int row = 0; row < ui->tableWidget->rowCount(); row++)
      for(int column = 1; column < 2; column++)
      {
           item->setText(QString("%1").arg(l));


           ui->tableWidget->setItem(row, column, item);
      }

но планируется, что пользователь сам вводит данные в таблицу в первом столбце.
Как сделать чтобы таблица обновлялась после ввода?


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: Asechka от Декабрь 21, 2014, 15:51
Была проблема в создании самой анимации(движения). Она благополучно решилась.
Полагаю с помощью ф-ций sin/cos. И если только шарик на ниточке - зачем тащить OpenGL?

Планировалась 3D модель маятника.


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: 8Observer8 от Декабрь 21, 2014, 16:13
хотелось бы сделать QTableWidget
В QTableWidget не знею как, а в QTableView есть такая фишка: создаёшь объект класса QStandardItemModel и устанавливаешь для таблицы эту модель. Работаешь с моделью, а она сама синхронизует с GUI

Планировалась 3D модель маятника
Поделитесь математикой. Мне интересно сделать пример


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: Asechka от Декабрь 21, 2014, 16:17
Только пока он у меня немного корявый но работает вроде.

*.h
#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QGLWidget>
#include <QtOpenGL>
#include <QTimer>
#include <glut.h>
#include <GLAUX.H>
#include <math.h>



class GLWidget : public QGLWidget
{
    Q_OBJECT
private:
    GLdouble x1;
    GLdouble y1;
    double n, N;
    QTimer *timer;


public:
   explicit GLWidget(QWidget *parent = 0);
   // ~GLWidget();
   void initializeGL();
   void paintGL();
   void resizeGL(int w, int h);
   void stopTmr();
   void startTmr();
public slots:
   void change();

};

#endif // GLWIDGET_H

*.cpp
#include "glwidget.h"
#include <QtGui>
#include <math.h>


int l=0;
double x=0.0, y=0.0;


GLWidget::GLWidget(QWidget *parent):
    QGLWidget(parent)
{
    x1=0.0; y1=0.0; n=30; N=10;


    timer = new QTimer;
    QPushButton *start = new QPushButton("start",this);
    start->setGeometry(280,290,91,31);
    connect(start, SIGNAL(clicked()), this, SLOT(change()));
        timer->start(1000);
       
    QGLFormat frmt;
          frmt.setSwapInterval(1);
          setFormat(frmt);
}

void GLWidget::initializeGL()
{
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glShadeModel(GL_FLAT);
}

void GLWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glPushMatrix();

        glColor3f(0.0, 0.0, 0.0);
        glBegin(GL_LINES);
            glLineWidth(6);
            glVertex3f(x1, y1, 0.0);
            glVertex3f(0.0, 1.0, 0.0);
        glEnd();
    glPopMatrix();

    glPushMatrix();
        glTranslated(x1, y1, 0.0);
        glColor3f(2.0, 0.0, 0.0);
        glutSolidSphere(0.2, 21, 2);
    glPopMatrix();
}

void GLWidget::change()
{
    for(double j=0.0; j<N; j++)
    {
        for(double i=0.0; i<n; i+=0.5)
        {
            x1 += 0.005;
            y1 += 0.002;
            updateGL();
        }
        timer->stop();

        for(double i=0.0; i<n; i+=0.5)
        {
            x1 -= 0.005;
            y1 -= 0.002;
            updateGL();
        }
        timer->stop();

        for(double i=0.0; i<n; i+=0.5)
        {
            x1 -= 0.005;
            y1 += 0.002;
            updateGL();
            timer->stop();
        }
         timer->stop();

        for(double i=0.0; i<n; i+=0.5)
        {
            x1 += 0.005;
            y1 -= 0.002;
            updateGL();
        }
        timer->stop();
    }
}



void GLWidget::resizeGL(int w, int h)
{
    glViewport(0, 0, (GLint)w, (GLint)h);
}

void GLWidget::stopTmr()
{
   timer->stop();
}

void GLWidget::startTmr()
{
   timer->start();
}


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: Igors от Декабрь 21, 2014, 18:34
void GLWidget::change()
{
    for(double j=0.0; j<N; j++)
    {
        for(double i=0.0; i<n; i+=0.5)
        {
            x1 += 0.005;
            y1 += 0.002;
           updateGL();
"Ну вы, блин, даете". В аттаче работающий пример, замените хедер(ы) если версия Qt поновее


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: Asechka от Декабрь 21, 2014, 19:07
void GLWidget::change()
{
    for(double j=0.0; j<N; j++)
    {
        for(double i=0.0; i<n; i+=0.5)
        {
            x1 += 0.005;
            y1 += 0.002;
           updateGL();
"Ну вы, блин, даете". В аттаче работающий пример, замените хедер(ы) если версия Qt поновее
Учту


Название: Re: Анимация математического маятника (OpenGL)
Отправлено: Igors от Декабрь 22, 2014, 14:14
Поделитесь математикой. Мне интересно сделать пример
Математика вверху (аттач). Жду красивого примера  :)