Jump to content

skrypt tworzacy pudelko - problemy


3dsmaxman
 Share

Recommended Posts

mam taki skrypt (pierwszy napisany przez siebie metoda prob i bledow :/) :

vert_array = #()

#()

face_array = #()

#()

 

v1 = [0,0,0]

[0,0,0]

v2 = [1,0,0]

[1,0,0]

v3 = [1,1,0]

[1,1,0]

v4 = [0,1,0]

[0,1,0]

v5 = [0,0,1]

[0,0,1]

v6 = [1,0,1]

[1,0,1]

v7 = [1,1,1]

[1,1,1]

v8 = [0,1,1]

[0,1,1]

 

append vert_array v1

#([0,0,0])

append vert_array v2

#([0,0,0], [1,0,0])

append vert_array v3

#([0,0,0], [1,0,0], [1,1,0])

append vert_array v4

#([0,0,0], [1,0,0], [1,1,0], [0,1,0])

append vert_array v5

#([0,0,0], [1,0,0], [1,1,0], [0,1,0], [0,0,1])

append vert_array v6

#([0,0,0], [1,0,0], [1,1,0], [0,1,0], [0,0,1], [1,0,1])

append vert_array v7

#([0,0,0], [1,0,0], [1,1,0], [0,1,0], [0,0,1], [1,0,1], [1,1,1])

append vert_array v8

#([0,0,0], [1,0,0], [1,1,0], [0,1,0], [0,0,1], [1,0,1], [1,1,1], [0,1,1])

 

append face_array [1,4,3]

#([1,4,3])

append face_array [3,2,1]

#([1,4,3], [3,2,1])

append face_array [1,2,6]

#([1,4,3], [3,2,1], [1,2,6])

append face_array [6,5,1]

#([1,4,3], [3,2,1], [1,2,6], [6,5,1])

append face_array [2,3,7]

#([1,4,3], [3,2,1], [1,2,6], [6,5,1], [2,3,7])

append face_array [7,6,2]

#([1,4,3], [3,2,1], [1,2,6], [6,5,1], [2,3,7], [7,6,2])

append face_array [3,4,8]

#([1,4,3], [3,2,1], [1,2,6], [6,5,1], [2,3,7], [7,6,2], [3,4,8])

append face_array [8,7,3]

#([1,4,3], [3,2,1], [1,2,6], [6,5,1], [2,3,7], [7,6,2], [3,4,8], [8,7,3])

append face_array [4,1,5]

#([1,4,3], [3,2,1], [1,2,6], [6,5,1], [2,3,7], [7,6,2], [3,4,8], [8,7,3], [4,1,5])

append face_array [5,8,4]

#([1,4,3], [3,2,1], [1,2,6], [6,5,1], [2,3,7], [7,6,2], [3,4,8], [8,7,3], [4,1,5], [5,8,4])

append face_array [5,6,7]

#([1,4,3], [3,2,1], [1,2,6], [6,5,1], [2,3,7], [7,6,2], [3,4,8], [8,7,3], [4,1,5], [5,8,4], [5,6,7])

append face_array [7,8,5]

#([1,4,3], [3,2,1], [1,2,6], [6,5,1], [2,3,7], [7,6,2], [3,4,8], [8,7,3], [4,1,5], [5,8,4], [5,6,7], [7,8,5])

 

m = mesh vertices:vert_array faces:face_array

$Editable_Mesh:Object03 @ [0.000000,0.000000,0.000000]

 

no i niestety efekt nie jest w pełni zadowaljący - na dwóch przeciwległych ściankach pojawiają się krawędzie ścianek, jakby nie były połączone:

 

boxpc4ui.jpg

boxp02c4hy.jpg

 

jaki błąd popełniłem w skrypcie?

z góry dziękuję

Link to comment
Share on other sites

Napisałem to od nowa po swojemu układając vertexy i face'y, gdyż w ten sposób szybciej mogłem wprowadzić dane których u Ciebie brakuje

vert_array = #()
face_array = #()

append vert_array [0,0,0]
append vert_array [0,1,0]
append vert_array [1,0,0]
append vert_array [1,1,0]
append vert_array [0,0,1]
append vert_array [0,1,1]
append vert_array [1,0,1]
append vert_array [1,1,1]

append face_array [2,3,1]
append face_array [3,2,4]
append face_array [5,2,1]
append face_array [2,5,6]
append face_array [6,4,2]
append face_array [4,6,8]
append face_array [8,3,4]
append face_array [3,8,7]
append face_array [7,1,3]
append face_array [1,7,5]
append face_array [7,6,5]
append face_array [6,7,8]

sgroup_array = #(1,1,2,2,4,4,8,8,16,16,32,32)

nowy = mesh vertices:vert_array faces:face_array

for f = 1 to 12 do
(
setFaceSmoothGroup nowy f sgroup_array[f]
setEdgeVis nowy f 1 false
setEdgeVis nowy f 2 true
setEdgeVis nowy f 3 true
)
update nowy

Rzeczy, których u Ciebie brakuje, to te, które odbywają się w pętli 'for'

 

Muszisz jeszcze oprócz tworzenia mesh'a zdefiniować dla każdego face'a smoothing group do jakiej ma należeć:

setFaceSmoothGroup nowy f sgroup_array[f]

 

Do których grup sg należy face, definiuje się za pomocą 32-bitowych (tyle jest grup sg) liczb binarnych. Stąd w tablicy kolejne potęgi dwójki.

Np. liczba 8 (binarnie 1000) oznacza, że face należy do 4 grupy SG

liczba 13 (1101) oznacza, że face należy do grup: 1,3,4

 

dodatkowo te linie:

setEdgeVis nowy f 1 false

setEdgeVis nowy f 2 true

setEdgeVis nowy f 3 true

pozwalają na ukrycie edge, które są na przekątnych poly.

Wlaśnie dlatego stworzyłem bryłę po swojemu, gdyż u Ciebie pewnie musiałbym inaczej dobierać, które krawędzie ukrywać, a które nie.

 

Ja się zbytnoi na tym nie znam ale wydaje mi się, że to jest problemem.

Jeśli się mylę, lechoo na pewno mnie skoryguje ;)

 

***EDIT***

Przejrzałem dokładniej Twój schemat tworzenia bryły i jest tam trzymanie się algorytmu podobnie jak u mnie więc cały ten mój wykład ogranicza się do tego, abyś po linii "m = mesh vertices:vert_array faces:face_array" w swoim skrypcie dodał coś takiego:

sgroup_array = #(1,1,2,2,4,4,8,8,16,16,32,32)
for f = 1 to 12 do
(
setFaceSmoothGroup m f sgroup_array[f]
setEdgeVis m f 1 true
setEdgeVis m f 2 true
setEdgeVis m f 3 false
)
update m

Teraz nadanie grup SG na box'a jeszcze ujdzie, ale w dalszym zastosowaniu staje się nieco uciążliwe?

Możesz się oddać w ręce automatu. Zamiast tego, co podałem wyżej, wstaw to:

addmodifier m (Smooth autosmooth:true threshold:30)
convertToMesh(m)
update m

parametrem threshold decydujesz, kiedy face'y dostaną te same a kiedy różne grupy SG, po szczegóły już odeślę do help'a bo i tak rozpisałem się tutaj ponad norme ;)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

We are using cookies. Read about our Privacy Policy