Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
fsdfsgwergwrwh
1 / 1 / 0
Регистрация: 17.11.2015
Сообщений: 156
1

Получить вершины эллипсоида

20.11.2016, 17:17. Просмотров 508. Ответов 6
Метки нет (Все метки)

данный кусок кода рисует гиперболоид
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
float WinWid = 600.0;
float WinHei = 600.0;
int AngleX = 0;
int AngleY = 0;
int vx = 5;
int vy = 0;
float Scale = 1;
float x = 0, y = 0;
const float a = 1;
const float c = 1;
 
const int uMin = 0;
const int uMax = 7;
const int vMin = 0;
const double vMax = 2 * M_PI;
const double vStep = 0.15;
const double uStep = 0.15;
 
double functionX(double u, double v)
{
  return (-a)*sin(u) + a*v*cos(u);
}
 
double functionY(double u, double v)
{
  return a*cos(u) + a*v*sin(u);
}
 
double functionZ(double v)
{
  return +c*v;
}
double functionAX(double u, double v)
{
  return (-a)*sin(u) - a*v*cos(u);
}
 
double functionAY(double u, double v)
{
  return a*cos(u) - a*v*sin(u);
}
 
double functionAZ(double v)
{
  return -c*v;
}
 
 
void Draw()
{
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  AngleX %= 360;
  AngleY %= 360;
  glPushMatrix();
  glRotatef(AngleX, 1, 0, 0);
  glRotatef(AngleY, 0, 0, 1);
 
  glBegin(GL_TRIANGLE_STRIP);
  for (double u = uMin; u <= uMax; u += uStep)
  {
    for (double v = vMin; v <= vMax; v += vStep)
    {
      glColor3f(3.0, 1.0, 0);
 
      glVertex3f(functionX(u, v), functionY(u, v), functionZ(v));
      glVertex3f(functionX(u, v + vStep), functionY(u, v + vStep), functionZ(v));
      glVertex3f(functionX(u + uStep, v), functionY(u + uStep, v), functionZ(v + uStep));
      glVertex3f(functionX(u + uStep, v), functionY(u + uStep, v), functionZ(v + uStep));
      glVertex3f(functionX(u + uStep, v + vStep), functionY(u + uStep, v + vStep), functionZ(v + uStep));
      glVertex3f(functionX(u, v + vStep), functionY(u, v + vStep), functionZ(v));
      glColor3f(0, 0, 1);
      glVertex3f(functionAX(u, v), functionAY(u, v), functionAZ(v));
      glVertex3f(functionAX(u, v + vStep), functionAY(u, v + vStep), functionAZ(v));
      glVertex3f(functionAX(u + uStep, v), functionAY(u + uStep, v), functionAZ(v + uStep));
      glVertex3f(functionAX(u + uStep, v), functionAY(u + uStep, v), functionAZ(v + uStep));
      glVertex3f(functionAX(u + uStep, v + vStep), functionAY(u + uStep, v + vStep), functionAZ(v + uStep));
      glVertex3f(functionAX(u, v + vStep), functionAY(u, v + vStep), functionAZ(v));
    }
  }
  glEnd();
  glPopMatrix();
 
 
  glutSwapBuffers();
}
вопрос: как найти вершины, например, для эллипсоида
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2016, 17:17
Ответы с готовыми решениями:

Вершины
Доброго времени суток! Начал програмировать на OpenGL + GLUT. Столкнулся с...

Id вершины + VAO
В общем помню давно читал что есть возможность добавлять вершину к полигону по...

Передать вершины в шейдер
разбираюсь с opengl по данному уроку...

OpenGL. GL_TRIANGLE_FAN освещение первой вершины
Здравствуйте. Я недавно решил заняться изучением OpenGL и вот у меня возникла...

Индекс вершины массива, переданной в шейдер
Возможно ли получить индекс вершины массива, переданной в шейдер, в этом...

6
vxg
Модератор
3265 / 2063 / 325
Регистрация: 13.01.2012
Сообщений: 8,003
20.11.2016, 18:41 2
fsdfsgwergwrwh, открыть книгу и взять уравнение в сферических координатах

Добавлено через 13 минут
... как вариант попробовать откопать тут Библиотека графических примитивов. Отдаю всем хорошим людям - не жалко
0
Excalibur921
763 / 435 / 71
Регистрация: 12.10.2013
Сообщений: 2,915
23.11.2016, 14:11 3
Цитата Сообщение от fsdfsgwergwrwh Посмотреть сообщение
рисует гиперболоид
Координаты точек на гиперболе повернуть в 3д…
Аналогично эллипсоид.
Можно кривой Безье задать кривую в 2д или 3д и строить поверхности вращения которым задавать форму таким методом.
0
8Observer8
2320 / 1480 / 245
Регистрация: 05.10.2013
Сообщений: 4,631
Записей в блоге: 58
23.11.2016, 15:44 4
В первую очередь, конечно, нужно сначала математически решить задачу с получением точек эллипсоида, которые будет соединять ломаная, а потом уже браться за реализацию программы.
0
fsdfsgwergwrwh
1 / 1 / 0
Регистрация: 17.11.2015
Сообщений: 156
23.11.2016, 23:21  [ТС] 5
пытаюсь нарисовать эллипсоид
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    // fi = 80 * c
    float r = 1;
    float c =3.14159/180.0; 
    float z;
    for (float thet=-180.0; thet<=180.0; thet+=20.0)
    {
        x = r * cos(c*80.0)*cos(c*thet);
        y = r * cos(c*80.0)*sin(c*thet);
        z = r * sin(c*80.0);
        myVector.push_back(vec3(x, y, z));
    }
 
        ...........................
    glDrawArrays(GL_TRIANGLE_FAN, 0, myVector.size());
рисует, но в 2d,т.е. эллипс.
в чем может быть дело?

 Комментарий модератора 
Ваш "новый" вопрос перенесен в вашу же более раннюю тему. Не плодите темы!
0
fsdfsgwergwrwh
1 / 1 / 0
Регистрация: 17.11.2015
Сообщений: 156
24.11.2016, 00:35  [ТС] 6
переделал на такой код:
C++
1
2
3
4
5
6
7
    for (double u = uMin; u <= uMax; u += uStep)
    {
        for (double v = vMin; v <= vMax; v += vStep)
        {
            myVector.push_back(vec3(2*cos(u)*cos(v), 2*cos(u)*sin(v), sin(u)));
            }
    }
работает, если рисовать линиями.
но мне нужно рисовать треугольниками. чтобы потом наложить текстуру на нее.
0
Миниатюры
Получить вершины эллипсоида  
Igor3D
1227 / 594 / 74
Регистрация: 01.10.2012
Сообщений: 2,844
24.11.2016, 08:54 7
Предыдущая попитка была удачнее - там хоть просматривалась общая конструкция, а тут глухое "жопка к жопке". Возможно препод пытается Вас научить как строить параметрические поверхности. Есть 2 "параметра" (u, v) которые меняются с каким-то шагом, вычислим вертекс для эллипсоида
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Vec3 scale(1, 2, 1);   // масштабы по осям
 
Vec3 CalcVer( float u, float v )  // u - азимут в плоскости XOZ, (от 0 до 2PI), v - угол возвышения (от -PI/2 до +PI/2)
{
// считаем как для сферы
  Vec3 result;
  result.y = sin(v);
  float lenXZ = sqrt(1.0f - result.y * result.y);
  result.x = cos(u) * lenXZ; 
  result.z = sin(u) * lenXZ; 
 
// масштабим по осям
 result.x *= scale.x;
 result.y *= scale.y;
 result.z *= scale.z;
 
// готовченко
 return result; 
}
Нормали посчитаете производной, в школе проходили
0
24.11.2016, 08:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2016, 08:54

Определение видимости полигона или вершины
Здравствуйте! Хочу узнать, есть ли процедура, с помощью которой в OpenGl...

Куб - вершины, нормали, текстуры - как задать
В игре, которую я делаю, нужно нарисовать куб, задав вершины, индексы и все...

Не выпуклый полигон. Дублирование первой и последней вершины. Зачем?
Доброго времени! Во многих GIS, графических API и просто в различных форматах...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru