Jak generować trójwymiarową rurę o różnych kształtach?

0

Bawię się od wczoraj w Qt 3D (pierwsze podejście do 3d). Tworzę prostą grę logiczną i natrafiłem na problem.

Jak stworzyć trójwymiarową rurę, łączącą dwa punkty w przestrzeni. Rura musi mieć możliwość ustawiania z poziomu kodu grubości, oraz kształtu łączenia (prosta, zygzak, fala, łuk).

Dopóki rura jest prosta, wystarczy zwykły cylinder (w qt gotowy mesh). Ale jak najlepiej zrobić łuk pomiędzy dwoma punktami? Albo żeby rura pomiędzy nimi falowała?

Mam dwa pomysły:
1) Stworzyć odpowiednie rury jako modele 3d i skalować/dolepiać do siebie. Tylko chyba nie dam rady tak modyfikować grubości? Skalowanie może też wyglądać nienaturalnie.
2) Generowanie odpowiedniego kształtu bezpośrednio w OpenGL.

Które podejście ma większy sens?

1

Nie bawiłem się w Qt 3D nigdy, ale wnioskuję z Twojego pytania, że jest tam zbiór gotowych meshy, które sobie stawiasz na scenie.
Jeżeli masz dostęp do GeometryShadera to możesz tam wykonać transformacje.

1

Jeśli potrafisz wyznaczyć linię wzdłóż, której biegnie rura, to wyliczenie wierzchołków tworzących rurę wokół punktów tej linii nie powinno sprawiać większych trudności. W sumie wysztarczy się przyglądnąć wzorowi na okrąg używający sinus, cosinus i trochę pokombinować z przniesieniem tego w 3 wymiary (zamienić x z z, zmieniać nachylenie okręgu osią x, w zależności od skosu po którym biegnie rura). Wzory będą bardziej złożone, jeśli rura nie będzie biegła po 2 wymiarach, tylko jeszcze wgłąb, ale za to będziesz miał uniwersalny generator rur ;)

No i jeszcze trzeba będzie pomyśleć nad teksturowaniem... Najłatwiej zastosować jednolitą teksturę, która ładnie się łączy na brzegach.

BTW. to nie jest nietuzinkowy temat. Bardziej newbie.

1

Hej,
temat bardzo prosty nie jest... looknij tutaj: https://pl.wikipedia.org/wiki/Krzywa_B%C3%A9ziera a potem spróbuj wygooglać odpowiednie, bardziej praktyczne tematy, może nawet przykłady dla Twojego środowiska projektowego... :)

1

Aktualnie rozwiązanie to właśnie krzywa beziera między punktami, a potem napompowanie jej do 3d. Rura idzie w dwóch wymiarach, wielkiego problemu z tym nie ma, teksturowanie ogarnia framework. Wiem że mogę też ogarnąć tak fale i eske funkcjami trygonometrycznymi. Na pewno pobawię się jeszcze GeometryShaderem.

Ot, myślałem że z gotowymi modelami 3d da się to zrobić bardziej efektywnie i efektownie. Jeżeli temat do newbie, sorka, na innym forum z newbie temat przenieśli :D. Dzięki!

0

Z dwóch punktów robisz funkcję liniową. y=ax+b
Z 3 punktów krzywą z interpolacji kwadratowej a, b, c return lineral(lineral(a), lineral(b))
Z dwóch kwadratowych robisz cubikową interpolację. ( return lineral( squar(a,b,c), squar(b,c,d))

Krzywe wychodzą jakie chcesz w tym wypadku wyjdzie taka rura jakiej potrzebujesz.

Edit: ale chaotycznie napisałem.
Od punktu a, do b robisz jedną funkcję liniową.
Potem od b do c drugą.
I potem liniową z tych wyliczonych punktów.

Standardowy w 3d curve algorytm i przy różnych falach aproksymacji, żeby pikowate nie wyszły.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0