ПрограммированиеФорумГрафика

из плоскости в полусферу

#0
14:18, 27 авг 2022

Всем привет!
Помогите разобраться. Как из плоскости сделать полусферу? Например есть Plane 2х2 клетки размером 100х100. Как этот план выгнуть полусферой, зная радиус? Радиус = 50.

В 3D Max-е есть модификатор spherify который из куба делает сферу, вот мне нужно понять, по какой формуле из прямоугольных координат X,Y преобразовать в сферические координаты? Я пишу скрипт на 3D Max-е, но в упор понять не могу, что там за формула?

Вот например координаты вершин ровного Plane:

1) X: -50.0 Y: -50.0 Z: 50.0
2) X: 0.0 Y: -50.0 Z: 50.0
3) X: 50.0 Y: -50.0 Z: 50.0

4) X: -50.0 Y: 0.0 Z: 50.0
5) X: 0.0 Y: 0.0 Z: 50.0
6) X: 50.0 Y: 0.0 Z: 50.0

7) X: -50.0 Y: 50.0 Z: 50.0
8) X: 0.0 Y: 50.0 Z: 50.0
9) X: 50.0 Y: 50.0 Z: 50.0

7------8------9
|........|........|
|........|........|
4------5------6
|........|........|
|........|........|
1____2____3

так как это плоскость, то Z всегда равен 50

Но вот как поменять координаты, чтобы плоскость изогнулась по сфере с учётом заданного радиуса 50?
Это одна сторона куба, то есть 1/6 куба

Координаты должны стать такими:

1) X: -28.868 Y: -28.868 Z: 28.868
2) X: 0.0 Y: -35.355 Z: 35.355
3) X: 28.868 Y: -28.868 Z: 28.868

4) X: -35.355 Y: 0.0 Z: 35.355
5) X: 0.0 Y: 0.0 Z: 50.0
6) X: 35.355 Y: 0.0 Z: 35.355

7) X: -28.868 Y: 28.868 Z: 28.868
8) X: 0.0 Y: 35.355 Z: 35.355
9) X: 28.868 Y: 28.868 Z: 28.868

вот как? по какой формуле?

#1
15:45, 27 авг 2022

Cyrix
> В 3D Max-е есть модификатор spherify который из куба делает сферу
Да, но каждая грань это не полусфера, а алгоритм простой: берём вектор от цента куба к точке, нормализуем, умножаем на радиус и всё, вот тебе новая координата точки спроецированная на сферу заданной радиусом. Но это именно для стороны куба, именно cube to shpere, а не полусферы. Для полусферы нужен другой алгоритм.

#2
15:48, 27 авг 2022

Где то в глубине души я понимаю, что должна быть нормализация, но как это выполнить на скрипте 3d max-а?

#3
15:59, 27 авг 2022

Cyrix
>но как это выполнить на скрипте 3d max-а
Посмотри в руководстве по максу
а вообще нормализация делается так https://gamedev.ru/code/terms/Normalization

#4
16:48, 27 авг 2022

https://gamedev.ru/code/terms/Normalization


не совсем понятно:
length = sqrt(x*x + y*y + z*z)
тут я получу одно значение, а где вектор то? нужны координаты X,Y и Z

#5
17:24, 27 авг 2022

Для начала приводишь к диапозону -1.0..1.0

Потом если у тебя точки кружком:

  point.z = sqrt(1.0 - (point.x * point.x + point.y * point.y))

Если точки квадратиком то:

  float2 t = float2(point .x + point.y, point.x - point.y)
  return normalize(float3(t, 2.0 - abs(t.x) - abs(t.y)))
#6
17:33, 27 авг 2022

Cyrix
> не совсем понятно:
> length = sqrt(x*x + y*y + z*z)
> тут я получу одно значение, а где вектор то? нужны координаты X,Y и Z
"Одно значение", это длина вектора length = sqrt(x*x + y*y + z*z).
Нужно брать инвертированную длину inv_length = 1.0/sqrt(x*x + y*y + z*z).
Эту длину нужно умножить на каждую компоненту вектора x, y, z - получится новый нормализованный вектор.

Например, для 9 вершины inv_length = 1/86.6 = 0,011547.
Нормализованный единичный вектор будет = (X: 50.0 Y: 50.0 Z: 50.0) * 0,011547 = (X: 0,57736 Y: 0,57736 Z: 0,57736).
Теперь этот нормализованный вектор нужно умножить на радиус, в твоём случае радиус = 50 как я понимаю. Умножаем: (X: 0,57736 Y: 0,57736 Z: 0,57736) * 50 = (X: 28.868 Y: 28.868 Z: 28.868)

#7
17:50, 27 авг 2022

ОГРОМНОЕ ВАМ спасибо!!! Дай Вам Бог доброго здоровья и удачи!!! Спасибо!!!

ПрограммированиеФорумГрафика

Тема в архиве.