Russian Qt Forum
Октябрь 03, 2024, 01:37 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Анимация математического маятника (OpenGL)  (Прочитано 10965 раз)
Asechka
Гость
« : Декабрь 20, 2014, 14:45 »

Пытаюсь сделать анимацию маятника, но пока ничего не получается. Объясните как делать анимацию в qt с помощью OpenGL.
« Последнее редактирование: Декабрь 20, 2014, 15:25 от Asechka » Записан
Alexu007
Гость
« Ответ #1 : Декабрь 21, 2014, 09:15 »

А в чём затруднение? В самом процессе рисования или в программировании координат маятника?
Записан
8Observer8
Гость
« Ответ #2 : Декабрь 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. Есть много путей решения задачи. Я описал, тот которым сам бы решал
Записан
Asechka
Гость
« Ответ #3 : Декабрь 21, 2014, 14:46 »

Была проблема в создании самой анимации(движения). Она благополучно решилась.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Декабрь 21, 2014, 15:16 »

Была проблема в создании самой анимации(движения). Она благополучно решилась.
Полагаю с помощью ф-ций sin/cos. И если только шарик на ниточке - зачем тащить OpenGL?
Записан
8Observer8
Гость
« Ответ #5 : Декабрь 21, 2014, 15:19 »

Хорошо. Я там усложнил к тому же. Можно сделать в 2D и без текстур, просто цвета. Вот вращение треугольника по кругу: https://github.com/8Observer8/TranslatedTriangle



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

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

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

Если есть проект, то скиньте, пожалуйста, ссылку
« Последнее редактирование: Декабрь 21, 2014, 15:22 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #6 : Декабрь 21, 2014, 15:38 »

А можете мне помочь уже в другом вопросе? Я делаю таблицу QTableWidget. Не получается взять данные из ячейки и сделать так чтобы таблица реагировала на ввод с клавиатуры
Используйте QTableView. Он удобнее

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

Записан
8Observer8
Гость
« Ответ #7 : Декабрь 21, 2014, 15:47 »

График нарисован с помощью библиотеки QCustomPlot: http://www.qcustomplot.com/

Из примера выше можно почерпнуть, как с таблицей работать
Записан
Asechka
Гость
« Ответ #8 : Декабрь 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);
      }

но планируется, что пользователь сам вводит данные в таблицу в первом столбце.
Как сделать чтобы таблица обновлялась после ввода?
Записан
Asechka
Гость
« Ответ #9 : Декабрь 21, 2014, 15:51 »

Была проблема в создании самой анимации(движения). Она благополучно решилась.
Полагаю с помощью ф-ций sin/cos. И если только шарик на ниточке - зачем тащить OpenGL?

Планировалась 3D модель маятника.
Записан
8Observer8
Гость
« Ответ #10 : Декабрь 21, 2014, 16:13 »

хотелось бы сделать QTableWidget
В QTableWidget не знею как, а в QTableView есть такая фишка: создаёшь объект класса QStandardItemModel и устанавливаешь для таблицы эту модель. Работаешь с моделью, а она сама синхронизует с GUI

Планировалась 3D модель маятника
Поделитесь математикой. Мне интересно сделать пример
« Последнее редактирование: Декабрь 21, 2014, 16:16 от 8Observer8 » Записан
Asechka
Гость
« Ответ #11 : Декабрь 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();
}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Декабрь 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 поновее
Записан
Asechka
Гость
« Ответ #13 : Декабрь 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 поновее
Учту
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Декабрь 22, 2014, 14:14 »

Поделитесь математикой. Мне интересно сделать пример
Математика вверху (аттач). Жду красивого примера  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.287 секунд. Запросов: 23.