Как нарисовать сферический треугольник на сфере в 3D? - PullRequest
3 голосов
/ 03 июля 2010

Предположим, вы знаете три вершины для сферического треугольника.Тогда как вы рисуете стороны на сфере в 3D?

Мне нужен код на Python для использования в программном обеспечении для 3D-моделирования Blender.

У меня уже есть сфера в 3D в Blender.

Спасибо и счастливого смешивания.

примечание 1:

у меня есть 3 точки / вершины (p1, p2, p3) на сфере для сферического треугольника, но мне нужнопроследить ребра на сфере в 3D

так, какие бы уравнения были необходимы для определения всех вершин между каждой парой точек треугольника на ребрах сферы 3 от p1 до p2 - от p2 до p3 и от o3 до p1

я знаю, что это как-то связано с Большим кругом для геодезической на сфере, но не могу найти подходящие уравнения для расчетов в сферических координатах!

Спасибо


Большие круги

Было бы интересно увидеть решение с большим кругом и посмотреть решение в сферических координатах напрямую!

, но все же интересно сделать это в евклидовом пространстве

Спасибо


хорошо, я использовал эту идею отрезка линии между 2 точками

, но не сделал, как указано ранее,

я использовалальтернативный метод - интерполяция линии Безье **

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

, но было бы интересно посмотреть, как это делается с более ранним методом, но не уверен, как сделать цикл итерации?

как вы загружаете код Python здесь только после негос Ctrl-V?

Спасибо и с удовольствием 2.5


Я пользуюсь форумом блендеров, но не гарантирую, что получу четкий ответ все время!

этопочему я попробовал здесь - рискнул

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

2-другой предмет, который я открываюздесь пост о патче Безье с треугольником. Я знаю, что это не полезный инструмент, а просто чтобы показать, как это делается. У вас есть скрипт на python для выполнения этих патчей, и я задал этот квест на foum в blender, а также на IRC python и sems.быть мёртвым сейчас, наверное, ребята слишком заняты, заканчивая 2.5 Beta vesion, которая должна выйти через неделю или 2

Привет, спасибо за обсуждение по математике, если у меня есть проблема, чтобы вернуться завтра

Счастливой математики и 2,5

Ответы [ 2 ]

4 голосов
/ 03 июля 2010

Создание синусоидальной сетки

Python-код для создания синусоидальной сетки в Blender:

import math
import Blender
from Blender import NMesh

x = -1 * math.pi

mesh = NMesh.GetRaw()
vNew = NMesh.Vert( x, math.sin( x ), 0 )
mesh.verts.append( vNew )

while x < math.pi:
 x += 0.1
 vOld = vNew
 vNew = NMesh.Vert( x, math.sin( x ), 0 )
 mesh.verts.append( vNew )
 mesh.addEdge( vOld, vNew )

NMesh.PutRaw( mesh, "SineWave", 1 )
Blender.Redraw()

Объяснение кода: http://davidjarvis.ca/blender/tutorial-04.shtml

Алгоритм построения краев

Рисование одного отрезка линии аналогично рисованию трех, поэтому проблему можно переформулировать следующим образом:

Как вы рисуете дугу на сфере, дали две конечные точки?

Другими словами, нарисуйте дугу между следующими двумя точками на сфере:

  • P 1 = (x 1 , y 1 , z 1 )
  • P 2 = (x 2 , y 2 , z 2 )

Решите это путем построения множества средних точек вдоль дуги P 1 P 2 следующим образом:

  1. Рассчитайте радиус сферы: R = sqrt( x<sub>1</sub><sup>2</sup> + y<sub>1</sub><sup>2</sup> + z<sub>1</sub><sup>2</sup> )
  2. Рассчитать среднюю точку ( м ) линии между P 1 и P 2 : P<sub>m</sub> = (x<sub>m</sub>, y<sub>m</sub>, z<sub>m</sub>) x<sub>m</sub> = (x<sub>1</sub> + x<sub>2</sub>) / 2 y<sub>m</sub> = (y<sub>1</sub> + y<sub>2</sub>) / 2 z<sub>m</sub> = (z<sub>1</sub> + z<sub>2</sub>) / 2
  3. Рассчитать длину до средней точки линии между P 1 и P 2 : L<sub>m</sub> = sqrt( x<sub>m</sub><sup>2</sup>, y<sub>m</sub><sup>2</sup>, z<sub>m</sub><sup>2</sup> )
  4. Рассчитать отношение радиуса сферы к длине средней точки: k = R / L<sub>m</sub>
  5. Рассчитать среднюю точку по дуге: A<sub>m</sub> = k * P<sub>m</sub> = (k * x<sub>m</sub>, k * y<sub>m</sub>, k * z<sub>m</sub>)

Для P 1 до P 2 , создайте два ребра:

  • P 1 до A m
  • A м до P 2

Два края будут прорезать сферу. Чтобы решить эту проблему, вычислите средние точки между P 1 A m и A m P 2 . Чем больше середин, тем ближе сегменты линий будут следовать за поверхностью сферы.

Поскольку Блендер довольно точен в своих вычислениях, результирующая дуга, вероятно, будет (асимптотически) скрыта сферой. Создав треугольную сетку, отодвиньте ее от сферы на несколько единиц (например, 0,01 или около того).

Использовать сплайн

Другим решением является создание сплайна из следующего:

  • радиус сферы (рассчитывается, как указано выше)
  • P 1
  • A м
  • P 2

Полученные сплайны должны быть перемещены перед сферой.

Форумы художников Blender

Эксперты Blender также будут иметь отличные идеи о том, как решить эту проблему; попробуйте спросить их.

См. Также

http://www.mathnews.uwaterloo.ca/Issues/mn11106/DotProduct.php

http://cr4.globalspec.com/thread/27311/Urgent-Midpoint-of-Arc-formula

0 голосов
/ 03 июля 2010

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

...