OpenGL:Простроение 3D графиков
1. Величина видимого обзора очень мала, при отдалении на расстояние график просто исчезает
gluPerspective(0,1,0,100000.0f); - никакого эффекта
2. Непонятно как настроить вид, если график находитсяс не в пределах (-1,-1,-1)-(1,1,1), а допустим
в пределах (40,80,40)-(120,100,150)
Функция gluLookAt не очень помогает, отчасти из за первой проблемы,т.е.
gluLookAt(0,0,0,400,400,400,0,0,1); - ничего не видно, и вообще увеличение 3,4 и 5 параметров не даёт никакого визуального эффекта
3. Как выводить текст с помощю OpenGL ?(желательно попроще, без сторонних библиотек)
Спасибо тем, кто откликнется !
А чем тебе не понравился ответ на форуме на
3. Что касается вывода текста... На мой взгляд самый простой способ - использование функции wglUseFontBitmaps. Вот пример класса, предназначенного для работы с текстом:
#ifndef TFontH
#define TFontH
#include <windows.h>
typedef struct
{
int Height;
int Weight;
DWORD Italic;
DWORD Underline;
DWORD StrikeOut;
char *Name;
float Color[4];
} TFontInfo;
class TFont
{
HFONT _Font;
UINT _Offset;
int _Size;
public:
TFont(void);
TFont(TFontInfo &fontInfo);
~TFont(void);
__declspec (property(get = GetSize)) int Size;
int __fastcall GetSize(void)
{
return -_Size;
}
float Color[4];
bool __fastcall New (TFontInfo &info);
void __fastcall Delete(void);
void __fastcall DrawText(int x, int y, char *text); // вывод текста в экранных координатах (x, y)
void __fastcall DrawAlignedText(UINT horAlign, UINT verAlign, int x, int y, char *text); // вывод текста в экранных координатах (x, y) с выравниванием
};
#endif
#include "TFont.h"
#include "gl\gl.h"
TFont::TFont(void)
{
_Font = NULL;
_Offset = 0;
_Size = 0;
Color[0] = 1.0;
Color[1] = 1.0;
Color[2] = 1.0;
Color[3] = 1.0;
}
TFont::TFont(TFontInfo &fontInfo)
{
New(fontInfo);
}
TFont::~TFont(void)
{
Delete();
}
bool __fastcall TFont::New (TFontInfo &info)
{
Color = info.Color;
_Size = -MulDiv(GetDeviceCaps(wglGetCurrentDC(), LOGPIXELSY), info.Height, 72);
_Font = CreateFont(_Size, 0, 0, 0, info.Weight, info.Italic, info.Underline, info.StrikeOut, 204, 3, 2, 1, 34, info.Name);
_Offset = glGenLists(256);
SelectObject(wglGetCurrentDC(), _Font);
wglUseFontBitmaps(wglGetCurrentDC(), 0, 256, _Offset);
return true;
}
void __fastcall TFont::Delete(void)
{
DeleteObject(_Font);
glDeleteLists(_Offset, 256);
}
void __fastcall TFont::DrawText(int x, int y, char *text)
{
glListBase(_Offset);
glColor4fv(Color);
glWindowPos2iARB(x, y);
glDisable(GL_DEPTH_TEST);
glPushAttrib(GL_BLEND);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glCallLists(GLsizei(strlen(text)), GL_UNSIGNED_BYTE, text);
glDisable(GL_BLEND);
glPopAttrib();
glEnable(GL_DEPTH_TEST);
}
void __fastcall TFont::DrawAlignedText(UINT horAlign, UINT verAlign, int x, int y, char *text)
{
SIZE Size;
SelectObject(wglGetCurrentDC(), _Font);
GetTextExtentPoint32(wglGetCurrentDC(), text, int(strlen(text)), &Size);
if (horAlign == TA_RIGHT)
x = x - (int)Size.cx;
else
if (horAlign == TA_CENTER)
x = x - (int)Size.cx / 2;
if (verAlign == TA_TOP)
y = y - (int)Size.cy;
else
if (verAlign == TA_CENTER)
y = y - (int)Size.cy / 2;
glListBase(_Offset);
glColor4fv(Color);
glWindowPos2iARB(x, y);
glDisable(GL_DEPTH_TEST);
glPushAttrib(GL_BLEND);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glCallLists(GLsizei(strlen(text)), GL_UNSIGNED_BYTE, text);
glDisable(GL_BLEND);
glPopAttrib();
glEnable(GL_DEPTH_TEST);
}
Подскажите может что есть ведь нельзя же так всё время все на глаз безье подгонять.:(
Ну если ты хочешь чтобы график гладенько выглядел - возьми в каждой точке усредненную по соседним точкам нормаль ! Тогда граней видно не будет . И расчетов вроде не много. Вот например смотри аттач
Вообще сначала математически проанализируй, а потом решай вопрос с визуализацией:)