Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание дуги, OpenGL 
:(
    Опции темы
decembrist
  Дата 24.11.2004, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Как создать дугу определенной длины, ширины и радиуса в виде фрагмента тора. Только тор задается внешним и внутренним радиусом, а мне необходимо задавать Н - высоту, L- длину, R - радиус. Вся загвоздка что нужен именно кусочек тора.
Подскажите кто может smile
PM MAIL   Вверх
DENNN
Дата 24.11.2004, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



Уточни, ты хочешь получить поверхность в виде апроксимированной с некоторым шагом сетки или в виде кривых?
PM ICQ   Вверх
decembrist
Дата 24.11.2004, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



В виде кривых
PM MAIL   Вверх
DENNN
Дата 24.11.2004, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



Сорри, но по памяти NURBS не помню. smile
PM ICQ   Вверх
decembrist
Дата 24.11.2004, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Ну, а вторым способом?
PM MAIL   Вверх
DENNN
Дата 24.11.2004, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



А во втором способе все достаточно просто. Рассматриваешь тор как вращающийся отрезок, который одним концом крепится к радиусу самого тора. Малуый радиус вращается в плоскости, перпендикулярной плоскости большой окружности. Пишешь функцию, которая по запрошенным двум углам возвращает координаты точки в пространстве.
С некоторым шагом перебираешь все значения углов от 0 до 360 градусов. Чем меньше шаг, тем выше детализация, но больше вершин. Тор в виде прямоугольников смотрится вполне достойно. smile

PM ICQ   Вверх
decembrist
Дата 25.11.2004, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Чей-то я не понял ничего... Ну а если упростить задачу и свести к 2х мерному изображению? Изобразить фрагмент кольца с заданой шириной H = R-r, длиной L, и радиусом изгиба R? Знаешь как сделать?
PM MAIL   Вверх
DENNN
Дата 25.11.2004, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



decembrist, если свести к двумерному, то это просто два круга получатся smile

Смотри, можно для простоты считать, что у тебя тор ориентирован параллельно некоторой плоскости.
Допустим радиус тора = R1
В плоскости тора радиус вращается на все 360 градусов. Пусть геометрический центр тора лежит в начале координат OXYZ, причем плоскость XY делит его пополам "вдоль" (извини, но без бумажки много лишних слов получается).
Пусть ось X совпадает с направлением радиуса, при котором его угол равен 0. Иными словами, будем отсчитывать угол от оси X в плоскости XY. Ось Z при этом направлена от нас.
Тогда, для любого угла A, координаты такого радиус-вектора будут равны
X=R1*cos(A)
Y=R1*sin(A)
Z=0

Давай во избежании путаницы обозначать их здесь R1x, R1y, R1z соответсвенно.
Твой бублик получается, если на конце твоего движущегося радиуса R1 поместить окружность с радиусом R2 в плоскости, перпендикулярной плоскости XY и ориентированной в каждый момент времени таким образом, что R1 всегда лежит в этой плоскости.
Тогда, если нулевой угол R2 отсчитывать от R1 по направлению к центру, то координаты точки поверхности тора для угла B отклонения R2 будут равны:

сначала найдем длину проекции R2 на R1
Rp=R2*cos(B)
теперь можно найти координаты вектора с длиной (R1-Rp)
X=(R1-Rp)*cos(A)
Y=(R1-Rp)*sin(A)
Если обратить внимание, что при B=0 вектор R2 совпадает с плоскостью XY (т.е. его Z-координата равна 0), то
Z=R2*sin(B)

Для упрощения программы, составим подпрограмму для расчета координат любой точки поверхности тора:
Код

inline void TorPoint (const double R1, const double R2, const double A, const double B, double& X, double& Y, double& Z)
{
double Rl; //здесь будем хранить значение (R1-Rp)
Rl=R1-R2*cos(B);
X=Rl*cos(A);
Y=Rl*sin(A);
Z=R2*sin(B);
return;
}

Теперь ты можешь постоить поверхность тора в виде сетки апроксимируя его с некторым шагом, к примеру 5 градусов.
Код

#ifndef PI
#define PI 3.141592653589793238462643
#endif

#define DEG_TO_RAD(x) x*PI/180.0
#define RAD_TO_DEG(x) x*180.0/PI

#define STEP 5.0 //шаг в градусах, с которым мы аппроксимируем наш тор
#define R1 10.0
#define R2  2.0
.....
double A;
double B;
double x,y,z;
glBegin(GL_POINTS);
for (A=0;A<360;A+=STEP)
{
 for(B=0; B<360;B+=STEP)
 {
     TorPoint (R1, R2, DEG_TO_RAD(A), DEG_TO_RAD(B), x, y, z);
     glVertex3d(x,y,z);
  }
}
glEnd();


Вот, примерно так. Написано все с клавиатуры, код не проверял, могут быть мелкие ошибки - если найдешь, то сообщи, я подправлю.
Здесь для простоты поверхность передается в виде точек. Если хочешь в виде квадратов, то тогда надо искать не одну, а 4 точки, отнимая или добавляя к соответствующим углам значение (STEP/2).

Удачи.
Добавлено @ 16:13
P.S. Блин, модераторы. Исправте вы этот дебильны серый цвет на константах - на таком фоне читать код тяжело.

Это сообщение отредактировал(а) DENNN - 25.11.2004, 16:11
PM ICQ   Вверх
decembrist
Дата 26.11.2004, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Гениально и просто! Спасибо огромное! smile Все понятно.
Просто у меня возникла проблема такая: есть стандартный способ нарисовать фрагмент тора используя функцию gluNewQuadric(), а затем

Цитата
gluQuadricDrawStyle(quadObj, GLU_FILL);
gluPartialDisk(quadObj, 0.3, 0.5, 5, 5, 30, 60);


например так. Но я работаю на платформе VS .NET 2003, а в ней не поддерживается почему-то эта фунция. Вот я и парился, как мне изобразить
В любом случае, я очень благодарен за помощь
PM MAIL   Вверх
DENNN
Дата 26.11.2004, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



Ты скажи. Ты код проверил? Если там какие-то глюки, то я подправлю для других smile.
Добавлено @ 16:16
Цитата

Но я работаю на платформе VS .NET 2003, а в ней не поддерживается почему-то эта фунция

Мой тебе личный совет: не увлекайся построениями через глют - это путь в никуда. Сложные модели тебе придется в программу подгружать, нестандартные поверхности генерить самому. gluQuadric..... в любом из жизненных решений обычно оказывается не нужен.
PM ICQ   Вверх
decembrist
Дата 3.12.2004, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Глюков не обнаружил. smile
PM MAIL   Вверх
DENNN
Дата 3.12.2004, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 2
Всего: 43



decembrist
Тогды картинку запость - другим посмотреть что получилось smile
PM ICQ   Вверх
decembrist
Дата 9.12.2004, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 1.4.2004

Репутация: нет
Всего: нет



Цитата
Тогды картинку запость - другим посмотреть что получилось

Не знаю как это делается smile Нужно урл вводить, какой?
Добавлено @ 11:36
Цитата
Тогды картинку запость - другим посмотреть что получилось

Не знаю как это делается smile Нужно урл вводить, какой?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0882 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.