Создание изогнутой сетки внутри сферы на основе координат изображения текстуры


8

В Blender я создал сферу с панорамной текстурой внутри. Я также вручную создал плоскую сетку (изогнутую, чтобы соответствовать размеру сферы), которая находится на внутренней стене, где я могу нарисовать другую текстуру.

Это здорово, но я действительно хочу сократить ручной труд и выполнить часть этой работы в сценарии - например, иметь переменную для панорамного изображения и координаты области на фотографии, которую я хочу заменить на новую сетка.

Самым сложным в этом будет создание изогнутой сетки в коде, которая может находиться на внутренней стене сферы.

Может кто-то указать мне верное направление?


Можете ли вы рассказать о том, что вы хотели бы сделать с меньшими усилиями? Объясните ваш текущий метод и ваш конечный результат более подробно?
Сет Бэттин

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

Я хотел бы иметь возможность отобразить равностороннее изображение внутри сферы и сделать прямоугольные рамки для фотографий (на изображении) содержащими динамические изображения. Тем не менее, я не хочу воссоздавать все с нуля каждый раз, когда я хочу представить новое равнобедренное изображение .... Чтобы упростить его, я хотел бы взять плоское изображение и использовать что-то вроде фотошопа, чтобы найти координаты xy рамки изображения и имеют новую сетку, которая сжимается, обернутую в сферу, которая соответствует этим 2d координатам.
user5025

Вы знаете, что Unity поддерживает скайбоксы? Похоже, это то, что вы пытаетесь достичь.
MichaelHouse

Мне известны скайбоксы, но, к сожалению, это не решает мою проблему. Мне нужен способ создать изогнутую сетку (которая будет идеально лежать на внутренней стороне сферы), основываясь на координатах рамки рисунка в равностороннем изображении.
user5025

Ответы:


0

То, чего вы пытаетесь достичь, похоже, очень связано с этим:

Аналог сферических координат в n-измерениях

в вашем случае в двух измерениях, тогда вы просто используете эту формулу, чтобы отобразить вершины прямоугольника, который у вас есть (будем надеяться, что он разделен) на вашей сфере (не забудьте умножить на где-то полудиаметр. Только математики живут на единичной сфере все остальные приличные люди используют диаметры ...)

РЕДАКТИРОВАТЬ: Поскольку все это немного расплывчато, я даю еще несколько идей, что вам нужно из этой формулы для использования:

x = r*sinθ*cosφ
y = r*sinθ*sinφ
z = r*cosθ

θ и φ - сферические координаты, которые вы ищете (широта и долгота), чтобы получить их, вы берете координаты x / y точек на части панорамного изображения как таковые:

public Void getPointPosOnSphere(float Longitude,float Latitude,float r) {
    x = r*Mathf.sin(Longitude)*Mathf.cos(Latitude);
    y = r*Mathf.sin(Longitude)*Mathf.sin(Latitude);
    z = r*Mathf.cos(Longitude);
    return new Vector3(x,y,z);
}

//here you could have a for loop iterating through points of your rectangle for each
//point you'd have associated a map coordinate :
Vector3 pointSpacePos = getPointPosOnSphere(pointCoordY,pointCoordX,HalfDiamater);
//End of the for loop

тогда вы получите отображение своего четырехугольника на сфере на основе его положения xy в 2D-системе координат, переведенной в 3D-положение в пространстве в соответствии с отображением сферы.

РЕДАКТИРОВАТЬ: Только что пришла идея, чтобы пойти дальше, вы можете инкапсулировать координаты плоскости на сфере, используя значения UV как таковые:

for(int i = 0;i < vertices.Length; i++) {
    vertices[i] = getPointPosOnSphere(UV[i].y,UV[i].x,HalfDiamater);
}

Там вы можете управлять положением четырехугольников в вашем любимом 3D-программном обеспечении (или даже с помощью кода через единицу), просто назначая значения UV (если от 0 до 1 по обеим осям, то квад будет обернут вокруг сферы)

ВНИМАНИЕ: Использование ультрафиолетовых лучей потребует от вас пересчета в радианы в градусы. (поскольку УФ от 0 до 1)


0

Ответ Жери Ардуино, приведенный выше, указал мне верное направление, но я хотел бы добавить пару вещей здесь.

1) Следующее не будет работать в единстве из-за различий в системе координат

    return new Vector3(x,y,z); 

изменить это на

    return new Vector3(x,z,y);

2) Мне неясно, какой диапазон значений long и lat определен в сигнатуре метода

     public Void getPointPosOnSphere(float Longitude,float Latitude,float r)

Значения долготы и широты должны быть в радианах. Их диапазон следующий

     Longitude: 0°-180° (0 - π)
     Latitude: 0°-360° (0 - 2π)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.