Pull to refresh

Comments 24

все прекрасно сударь, и не принимайте близко к сердцу, но!

  1. Ну Солнце то казалось бы физику, бог велел по орбите крутить, ну пускай даже вокруг "земли"

  2. Нуба в ДЗЗ выдают полюса =)

;D спасибо

  1. Так и выходит, солнце матрицей поворота крутит по орбите (система отсчета на Земле)

  2. Блин, пытался раскодировать, так и не понял про Д33. ;(

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

Так что - если знаете - пишите!

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

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

посложней, там полярные области проецируют не в меркатор, а в свой полярный EPSG (Coordinate Systems Worldwide), и потом уже жульничают на глобусе, склеивая по нужному меридиану.

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

Спасибо! Попробую

а почему так? ведь есть формула сферы и кватернионы вроде и шаг известен и вроде. сделал шаг обсчитал квадратик. сейчас перепроверился по кватерниону вроде всё сходится и будет +- как широкая обоя кинутая определенным образом из шага угла начиная с какогото полюса

В чём проблема один раз марчить через 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 метров в случае небольшой горной реки, её может и не оказаться на карте.

30 метров на пиксель, при полном покрытии, это весьма приличное разрешение. Более того, достаочное что бы поискать большой водопад, и понять что ваш метод не пригоден для этого

там разве что можно было морду лица кривить, что дескать вот с этого КА мне ваша радиометрия неоч, подайте с другого КА

Это прекрасно! Многим из хабра стоит у вас поучится

Sign up to leave a comment.

Articles