Построение поверхности по формуле 3D

Здравствуйте. Подскажите пожалуйста одну неочевидную вещь.
Есть формула некой поверхности. В ходе расчетов получил множество точек.
Каким образом дальше создать сетку из этих точек чтобы можно было отрисовать в той же OpenGL.
Определить порядок полигонов так сказать.

Спасибо.

Лучше графики рисовать то бишь строить GnuPlot, а не в OpenGL

Для OpenGL порядок определить легко.
Пусть у вас есть значения функции

for x:=0 to 100 step 1 do 
 for y:=0 to 100 step 1 do 
   z:=f(x,y)

Соответственно квадрат это 2 треугольника координаты квадрата

z00:=f(x,y)
z01:=f(x,y+Step)
z10:=f(x+Step,y)
z11:=f(x+Step,y+Step)

В OpenGL есть - лента просто пары точек ленты указываете

for y:=0 to 100 step 1 do 
  begin
  glBegin(GL_LINE_STRIP)
  for x:=0 to 100 step 1 do 
    begin
    z0:=f(x,y);
    z1:=f(x,y+Sterp);
    glVertex3f(x,y,z0);
    glVertex3f(x,y+Step,z1);
    end;
  glEnd();
  end;

Дальше z-буфер сам разберётся.

А если z-буфер не включать то строить от дальних к ближним и отсекать по высоте.

ПС. Если в функции есть дырки, то лучше не GL_LINE_STRIP, а GL_QUAD_STRIP или GL_QUADS

У меня поверхность задана в 3d типа x^2+y^2+z^2=C.
Про OGL это я так написал, по сути мне нужен алгоритм чтобы реализовать его в си.

Это сфера.
z(x,y)=±sqrt(C-x^2-y^2)
Можно разбить на две полусферы и нарисовать их отдельно как описано выше.
Можно перебрать широту и долготу
изображение
r:=sqrt( C );
F ( u , v ) = [ cos (u)*sin(v)*r, cos(v)*r, sin(u)*sin(v) * r ]

где:

  • r - это радиус;
  • u - долгота в диапазоне от 0 до 2π; и
  • v - широта, в диапазоне от 0 до π.

http://www.100byte.ru/stdntswrks/cshrp/sphTK/sphTK.html

Можно построить икосферу.
Икосфера — сфера, в основе которой лежит геометрическая фигура икосаэдр. Икосаэдр путем теселяции(разбиение треугольников) превращаться в сферу.
Достаточно 16 раз.
изображение

https://qastack.ru/gamedev/31308/algorithm-for-creating-spheres

Разобрался с поверхностью.
Тут другая проблема. Почему то криво отрабатывает центральная проекция.

вот есть матрица преобразования:
image

Сдвинул куб в нулевые координаты.
применяю матрицу и ожидаю такой вид:
image

Но почему то нифига не работает. Все равно проекция получается:

image

что может быть не так??

Поверхность лучше изначально записывать в параметрическом виде от u,v координат. Жалко потерял хорошую презенташку. Как дифгеометрией строят параметрическую модели куба и кружки из сферы и бублика соотвесвенно.

Код показывайте. Я конечно на обум могу сказать, что ошибка в 13 строчке. Но от этого легче не мне не вам не станет.
По рисунку похоже что у вас нужный код просто не выполняется.

void MultMarix(int ARows, int BCols, int ACols, float* A, float* B, float* C) {
	for (int i = 0; i < ARows; ++i) {
		float* c = C + i * BCols;
		for (int j = 0; j < BCols; ++j)
			c[j] = 0;
		for (int k = 0; k < ACols; ++k) {
			float* b = B + k * BCols;
			float a = A[i * ACols + k];
			for (int j = 0; j < BCols; ++j)
				c[j] += a * b[j];
		}
	}
}
Point3D* CreateCentralMatrix(float r) {
	Point3D P[4] = {
		{1,0,0,0},
		{0,1,0,0},
		{0,0,0,r},
		{0,0,0,1} };
	Point3D* M = (Point3D*)calloc(4, sizeof(Point3D));
	memcpy(M, P, sizeof(Point3D) * 4);
	return M;
}
void ApplyTransform(Point3D* model, int cnt, Point3D* Matrix, Point3D* destModel) {
	Point3D* transformed = (Point3D*)calloc(cnt, sizeof(Point3D));
	MultMarix(cnt, 4, 4, (float*)model, (float*)Matrix, (float*)transformed);

	for (int i = 0; i < cnt; i++)
	{
		float dt = 1.0f - transformed[i].q;
		transformed[i].x += dt;
		transformed[i].y += dt;
		transformed[i].z += dt;
		transformed[i].q += dt;
	}

	memcpy(destModel, transformed, sizeof(Point3D) * cnt);
	delete transformed;
}
Point3D offset = GetCenter(Quad, 8);
	ApplyTransform(rendermodel, 8, CreateTranslateMatrix(-offset.x, -offset.y, -offset.z), rendermodel);
	ApplyTransform(rendermodel, 8, CreateScaleMatrix(scale, scale, scale), rendermodel);
	ApplyTransform(rendermodel, 8, CreateCentralMatrix(-0.5), rendermodel);
        RenderQuad2D(hdc, rendermodel, 8);
	delete rendermodel;

Все остальные то матрицы работаю. И смещение и масштаб и поворот. Так что врядли там умножение косячит. Сам сдвиг к точке 100,100 делаю уже при рендеринге. Тупо прибавляю координаты нового центра. Так что это не должно влиять.

Должно влить. Вы поэтому и видите куб с боку.

Как оно так повлияет то если я уже готовую проекцию двигаю?

Как этот код сможет повернуть объект ??

void RenderQuad2D(HDC hdc, Point3D* pts, int cnt) {
	POINT* tmp = ConvertToPoint(pts, cnt);

	// общий центр в середине формы
	for (int i = 0; i < cnt; i++)
	{
		tmp[i].x += 500;
		tmp[i].y += 500;
	}

	// ïî ÷àñîâîé ñòðåëêå
	POINT side1[] = { tmp[0],tmp[3],tmp[2],tmp[1] }; // ADCB
	POINT side2[] = { tmp[2],tmp[3],tmp[7],tmp[6] }; // CDIG
	POINT side3[] = { tmp[6],tmp[7],tmp[4],tmp[5] }; // GIEF
	POINT side4[] = { tmp[5],tmp[1],tmp[0],tmp[4] }; // FBAE
	POINT side5[] = { tmp[2],tmp[6],tmp[5],tmp[1] }; // CGFB
	POINT side6[] = { tmp[7],tmp[3],tmp[0],tmp[4] }; // IDAE

	Polyline(hdc, side4, 4);
	Polyline(hdc, side1, 4);
	Polyline(hdc, side6, 4);

	Polyline(hdc, side2, 4);
	Polyline(hdc, side3, 4);
	Polyline(hdc, side5, 4);
	delete tmp;
}


Тут на фото белый куб в левом нижнем . А если бы у него были положительные координаты 0 и 1 то он бы был в правом верхнем как у вас.
Куб надо сдвинуть в центр вначале что бы координаты у него были -0.5 0.5

Вот его координаты

-0.500 -0.500 -0.500 
-0.500 -0.500 0.500 
-0.500 0.500 0.500 
-0.500 0.500 -0.500 
0.500 -0.500 -0.500 
0.500 -0.500 0.500 
0.500 0.500 0.500 
0.500 0.500 -0.500 

Я походу нашел в чем ошибка. Но не нашел формулы как считать.
Есть ресурс.

там есть фрагмент нормализации матрицы после применения проекции.
image

В конце происходит какая то нормализация данных. В результате последние элементы снова становятся 1.
Вначале показалось что там просто надо онять разницу но походу из за этого у меня значения координат получают обратные приращения и я не вижу искажения.

Поскажите пожалуйста что за формула такая. гугли про нормализацию но что то мне показалось что это что то другое.

ААА… Нашел вот какой то слайд в гугле.
Надо просто разделить. И все сразу заработало как надо…