[Delphi/GLScene] Dynamicznie tworzone obiekty - problem

0

Witam.
Chodzi o prosty projekt: Heightmapa, a na niej dynamicznie tworzone obiekty. Dodawanie obiektów wygląda następująco:

    for i:=1 to 100 do
        begin
          Obj:=TGLFreeForm(Dummy.AddNewChild(TGLFreeForm));
          Obj.LoadFromFile('tree.3ds');

          with Obj.Position do
              begin
                X:=Random(256);
                Z:=Random(256);
                Z:=(im.GetHeight(Round(x), round(y)));
              end;

          with Obj.Scale do
              begin
              X:=0.3;
              Y:=0.3;
              Z:=0.3;
              end;

          Obj.BuildOctree();
        end;

Cały problem polega na tym że, jeżeli dodam ten kod w Form1.OnCreate, wszystko działa jak należy, jednakże jeśli dodam ten kod na przykład w Button1.OnClick, po kliknięciu nic sie nie dzieje. Nie pomaga odświerzanie viewera, invalidate itd.

Ktoś natknął się na taką akcje? ;/

0

wiesz co najpierw zobacz czemu masz zle napisana petle

podpowiem ze obj zmieniasz 100 razy ale tylko w jednym obiekcie zamiast np., 100 obiekotw zmieniac (np, pozycje) to ty tylko jeden robisz

0

Nie zgodze się z tobą bo jeśli ten kod jest w OnCreate wszystko jest w porządku. Brak mi pomysłów co z tym zrobić :|

0

Tak z ciekawosci, co robi: TGLFreeForm(Dummy.AddNewChild(TGLFreeForm))

Chodzi mi tylko o to, czy to dodaje obiekty do jakiejs tablicy, listy, enumeratora, czy tylko tworzy obiekt i w nastepnym kroku o nim zapomina.

Mozliwe ze ...s sugerowal zeby te czesc kodu dac przed petle...jesli to bylaby lista, wowczas tworzenie obiektu Obj nabiera innego sensu.

Ja sie domyslam, ze jest jakas lista, ktora przetrzymuje wszystkie tworzone obj i w GLScene powoduje ich wyrenderowanie, ale moge sie mylic. Poki co to wyglada tak, ze 100 razy tworzysz obj, wczytujesz obiekt 3d nastepnie umieszczasz go gdzies na mapie terenu (swoja droga bez Randomize, ktory nie jest istota rzeczy).
Podaj prosze wiecej szczegolow.

a moze Button1.OnClick cos tam robi, tylko ze umieszcza obiekty w tych samych miejscach ?:) Czy to moze byc az tak oczywiste ?:) Wrzuc pozycje tworzonych obiektow do jakiegos komponentu memo, czy nawet w cmdline. (Celem wykluczenia mozliwosci tworzenia obiektow w tym samym miejscu)

0

ale co mnie to interesuje ze ty sie ze mna nie zgadzasz nawet ze swoim kodem sie nie zgadzasz nie ******* tylko popraw to i mnie nie ********

0

...literka, rozwazyles mozliwosc, ze TGLFreeForm(Dummy.AddNewChild(TGLFreeForm)) moze byc funkcja, ktora dodaje do listy nowo tworzone obiekty typu TGLFreeForm i zwraca TGLFreeForm jako wynik funkcji? Nastepnie obiekty GLScene moga korzystac z obiektu Dummy i tworzyc za jego posrednictwem render obiektow graficznych tree.3ds ?

Dlatego dla przykladu nie ma obj.free() ;/
Ten listening jest za krotki, potrzeba wiecej informacji, a nie dopieprzania sie o cokolwiek i zwyzywania uzytkownikow.

Spokojnie, to nie jest kwestia zycia i smieci :)

Chce wiedziec co to jest za twor to TGLFreeForm(), poki co na nic mi to nie wyglada :( ... funnkcja, klasa..obiekt? wtf? i co to jest Obj, poza tym ze zmienna... malo danych..

0

TGLFreeForm to klasa umożliwiająca wczytanie konkretnego modelu z pliku. Jeśli chodzi o dynamiczne tworzenie obiektu w GLScene, nie ma konstruktora typu Create. Objekt tworzy sie w chwili przypisania mu parenta (u mnie jest to obiekt Dummy). Finalnie ma to wyglądać tak że nasz Button1 ma pełnić role dodawania nowego obiektu na mapie: klikam wyskakuje opendialog, wybieram model a on pojawia mi sie w domyślnym punkcie [0,0,0], poczym moge go przemieszczać, oteksturować, obracać itp, czyli coś na kształt prostego edytora map.

Obj to nic innego jak TGLFreeForm

var
     Obj: TGLFreeForm;

Jeśli chodzi o zastosowanie tego kodu w OnCreate, to dodałem ten kod tylko w celu sprawdzenia czy to działa. Sprawdzałem również bez pętli, czyli stworzenie jednego obiektu. Rezultat ten sam, w OnCreate działa, w OnClicku nie.

0

A co sie dzieje, gdybys przypisal

with Obj.Position do
begin
  X:=i;
  Y:=i+1;
  Z:=0;
 end;

swoja droga przypisujesz X,Z,Z mozliwe ze przeoczenie. Nie wiem jak ta klasa dziala, mozliwe ze zeruje Y, a mozliwe ze masz drzewo gdzies w kosmosie :D
Jesli chcesz uzywac Random() Skorzystaj z Randomize(), poki co postaraj sie tworzyc drzewa w przewidywalnych miejscach. Dopiero jak bedzie ok, zrob sobie randomy

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