Comments 24
Хабру нужно больше таких статей!
все прекрасно сударь, и не принимайте близко к сердцу, но!
Ну Солнце то казалось бы физику, бог велел по орбите крутить, ну пускай даже вокруг "земли"
Нуба в ДЗЗ выдают полюса =)
;D спасибо
Так и выходит, солнце матрицей поворота крутит по орбите (система отсчета на Земле)
Блин, пытался раскодировать, так и не понял про Д33. ;(
А понял, вы про полюса облаков. Я так кстати и не понял, как можно меш квадратный натянуть на сферу. Вычислительная геометрия подсказывает, что без искажений - никак. А marching cubes на большом поле делать довольно дорого (если сразу шум генерить на сфере)
Так что - если знаете - пишите!
ДЗЗ - дистанционное зондирование земли, отрасль полная перепроецирования приполярных снимков в меркатор (одна из систем проекций). проблема там буквально Ваша, при "растягивании" приполярной области, чем она ближе к полюсу, тем больше уходит в бесконечность.
решают двумя путями, попроще, - области с которой начинается "все плохо", буквально тупо вырезают. по этому на многих глобусах, на которых можно посмотреть космоснимки, приполярные области и полюса отсутствуют.
посложней, там полярные области проецируют не в меркатор, а в свой полярный EPSG (Coordinate Systems Worldwide), и потом уже жульничают на глобусе, склеивая по нужному меридиану.
второй путь (который по-сложнее) теоретически можно применить на карте шума Перлина, тогда после преобразования в полигоны эти искажения должны компенсироваться (правда, число вершин и детализация все равно будет преобладать на полюсах)
Спасибо! Попробую
а почему так? ведь есть формула сферы и кватернионы вроде и шаг известен и вроде. сделал шаг обсчитал квадратик. сейчас перепроверился по кватерниону вроде всё сходится и будет +- как широкая обоя кинутая определенным образом из шага угла начиная с какогото полюса
потому, что в живой природе всё несколько сложней.
Coordinate Conversions and Transformations including Formulas . - https://www.iogp.org/wp-content/uploads/2019/09/373-07-02.pdf
В чём проблема один раз марчить через 3D перлин? В шейдерах обьёмные облака так и делают обычно.
Дорого. Не хочется сэмплить по слою сферы, на WL это очень неэффективно будет. Дешевле на тонком параллелепипеде, так как выйдет чистая и простая функцию, которая JIT-ом оптимизируется, и потом другой такой же свернуть.
Либо я что-то упускаю из вашей идеи...
Другой подход к созданию планеты показан тут - https://m.youtube.com/watch?v=lctXaT9pxA0
Там каждая грань куба делится много раз пополам и потом полученные точки равно удаляются от центра
Попробовал улучшить ситуацию. Берем текстуру шума (на этот раз 256х128)
n = 256;
k2 = Outer[Plus, #, #] &[RotateRight[N@Range[-n, n - 1, 2]/n, n/2]^2];
spectrum = With[{d := RandomReal[NormalDistribution[], {n, n}]},
(1/n) (d + I d)/(0.002 + k2)];
spectrum[[1, 1]] *= 0;
im[p_] := Clip[Re[InverseFourier[spectrum Exp[I p]]], {0, ∞}]^0.5
p0 = p = Sqrt[k2];
testImg = im[p0 += p][[128;;, All]] // Image
преобразуем
lat[y_, rad_:1] := ArcSin[(2 theta[y, rad] + Sin[2 theta[y, rad]])/Pi];
lon[x_, y_, rad_:1, lonzero_: 0] := lonzero + Pi x/(2 rad Sqrt[2] Cos[theta[y, rad]]);
theta[y_, rad_:1] := ArcSin[y/(rad Sqrt[2])];
mollweidetoequirect[{x_, y_}] := {lon[x, y], lat[y]};
testImg = ImageForwardTransformation[
testImg,
mollweidetoequirect,
DataRange -> {{-2 Sqrt[2], 2 Sqrt[2]}, {-Sqrt[2], Sqrt[2]}},
PlotRange -> All
]
Получаем следующее изображение

Затем, как обычно Marching Cubes
With[{plain = ImageData[testImg]}, Table[plain Exp[-( i)^2/200.], {i, -20,20}]];
{vertices, normals} = CMarchingCubes[%, 0.2, "CalculateNormals" -> False];
vertices = With[{
offset = {Min[vertices[[All,1]]], Min[vertices[[All,2]]], 0},
maxX = Max[vertices[[All,1]]] - Min[vertices[[All,1]]],
maxY = Max[vertices[[All,2]]] - Min[vertices[[All,2]]]
}, Map[Function[v, With[{p = v - offset}, {p[[1]]/maxX, p[[2]]/maxY, p[[3]]}]], vertices]];
Теперь проецируем эти вершины на сферу
pvertices = Map[Function[v,
With[{\[Rho] = 50.0 + 0.25 (v[[3]] - 10), \[Phi] = 2 Pi Clip[v[[1]], {0,1}], \[Theta] = Pi Clip[v[[2]], {0,1}]},
{\[Rho] Cos[\[Phi]] Sin[\[Theta]], \[Rho] Sin[\[Phi]] Sin[\[Theta]], \[Rho] Cos[\[Theta]]}
]
]
, vertices];
{
clouds = GraphicsComplex[0.017 pvertices, Polygon[1, Length[vertices]]]
} // Graphics3D

Видно другие артефакты, однако, на этот раз из-за того, что текстуру нельзя замостить, как я предполагаю...

И это тоже интересная задача!
Это что ИИ?
Пять лет назад пытался решить задачу "Как автоматически найти в горах Узбекистана высокие водопады". Тогда всё казалось простым - берёшь карту высот, определяешь водотоки; берёшь водотоки, определяешь падения высот.
На практике - не удалось найти в открытых данных карту высот с хорошим разрешением и проект остановился.
Интересно, сейчас ситуация получше?
очевидно что вы не там ищете, или просто не знаете необходимых терминов. карта высот называется srtm и выглядит как геопривязаный tiff в котором значение пикселя буквально высота. добывался примитивным гуглежом испокон веков как мне кажется
SRTM нагуглил довольно быстро, но там были данные от 2000 года + слишком малые по разрешению. 30 метров в случае небольшой горной реки, её может и не оказаться на карте.
там разве что можно было морду лица кривить, что дескать вот с этого КА мне ваша радиометрия неоч, подайте с другого КА
ну в конце то концов, - https://earthexplorer.usgs.gov/
Это прекрасно! Многим из хабра стоит у вас поучится
Моделируем поверхность Земли в пару строчек