Copy Location

Problemy ze skryptami w BGE.
Awatar użytkownika
janek
Posty: 237
Rejestracja: 19 lip 2012, 14:23
Lokalizacja: Gdańsk

Copy Location

Postautor: janek » 11 lut 2013, 12:51

Witam :D
Szukałem ostatnio w sieci skryptu na kopiowanie lokalizacji z innego obiektu. Niestety moje poszukiwania ostatecznie skończyły się klęską bo ani jeden skrypt nie działał :cry:

Macie może coś działającego pod 2.6?

Awatar użytkownika
Michalek
Posty: 47
Rejestracja: 01 sie 2012, 19:24

Re: Copy Location

Postautor: Michalek » 11 lut 2013, 14:51

Kod: Zaznacz cały

from bge import logic
cont = logic.getCurrentController()
own = cont.owner
scena = logic.getCurrentScene()
lista_obj = scena.objects
szescian_a = lista_obj["Cube"]
szescian_b = lista_obj["Cube2"]
#tu na sztywno wpisujesz polozenie
#szescian_b.position = [4,4,4]

#polozenie pierwszego szescianu jest skopiowane do drugiego
szescian_b.position = szescian_a.position


jak dostac sie do obiektu na scenie jest w moim tutku. Dalej napisalem ci jak zmienic polozenie obiektu na sztywno. Na samym koncu kopiuje polozenie pierwszego obiektu do drugiego. Szescian_b przyjmie polozenie szescianu_a

Chyba o to Ci chodzilo ;)

Awatar użytkownika
janek
Posty: 237
Rejestracja: 19 lip 2012, 14:23
Lokalizacja: Gdańsk

Re: Copy Location

Postautor: janek » 11 lut 2013, 15:53

Thx działa :D :D :D

Tylko tu pojawia się problem... . Działa tak jakby z opóźnieniem. A to nie dobrze bo chciałbym umieścić to na poruszającym się obiekcie :(
http://www.mediafire.com/?0dwz720xb1cmwe2

Awatar użytkownika
Michalek
Posty: 47
Rejestracja: 01 sie 2012, 19:24

Re: Copy Location

Postautor: Michalek » 11 lut 2013, 18:39

Kod: Zaznacz cały

from bge import logic , events
cont = logic.getCurrentController()
own = cont.owner
scena = logic.getCurrentScene()
lista_obj = scena.objects
szescian_b = lista_obj["Cube2"]

status = (logic.KX_SENSOR_INACTIVE, logic.KX_INPUT_ACTIVE, logic.KX_INPUT_JUST_RELEASED, logic.KX_INPUT_JUST_ACTIVATED)
klawiatura = logic.keyboard
if klawiatura.events[events.WKEY] == status[1]:
    own.applyMovement((0,0.2,0),False)
    szescian_b.localPosition = own.localPosition


No teraz dziala :P teraz w kodzie zamiast szescian_a uzyłem own czyli wlasciciela skryptu. W poprzednim tez tak moglem ale nie wiedzialem czy akurat chciales skopiowac polozenie z wlasciciela na inny obiekt. Tylko teraz poruszasz szescianem z poziomu kodu nie za pomoca actuatora "Motion" . W tutku masz opisane jak poruszac obracac itd.

Edit:
Wyczytalem w temacie "Polowanie" ze probujesz zrobic zeby strzaly sie wbijaly i podazaly wraz z obiektem w ktory sie wbily. Jezeli do tego chcesz uzyc powyzszego skryptu to bedzie ciezko. Łatwiej byloby poprostu zby strzala stala sie "dzieckiem" trafionego obiektu. Jezeli to wlasnie o to ci chodzi to pisz PW. :)

Awatar użytkownika
janek
Posty: 237
Rejestracja: 19 lip 2012, 14:23
Lokalizacja: Gdańsk

Re: Copy Location

Postautor: janek » 12 lut 2013, 11:47

Działa jednakże w moim przypadku nadal nie :( Ponieważ mam zamiar użyć tego do ciągnika a nie do strzały.
Wygląda to następująco:
Do pojazdu mam zparentowanego Empty. A Empty wywołuje skrypt który miałby przywołać kamere do swojego Loc.
Oczywiście zmieniłem skrypt (usunąłem siłe). Bo nie chciałbym żeby (Empty z kamerą) jeździł mi po pojeździe.
I tu się pojawia problem:
Ponieważ skrypt reaguje tylko raz. Dalsze wciskanie klawisza nie daje odpowiedzi. ( przypuszczalnie zmiana na always w skrypcie też by nic nie zmieniła).

Podesłać Pliczek?


Co chce uzyskać:

Kamere w kabinie ciągnika która reaguje tylko z ciągnikiem w osiach Rot_Z i LOC_XYZ (Rot Z już mam). Właściwie to Empty bo kamera będzie zparentowana do tego Empty.

Awatar użytkownika
Michalek
Posty: 47
Rejestracja: 01 sie 2012, 19:24

Re: Copy Location

Postautor: Michalek » 12 lut 2013, 19:40

No nie wiem za bardzo co chcesz uzyskac nie mozesz poprostu odrazu zrodzicowac kamery z ciagnikiem (w kabinie)??
"...mialby przywolywac kamere..." ta kamera najpierw jest za ciagnikiem? Jesli tak to przeciez mozna zrobic dwie kamery jedna za ciagnikiem druga w srodku i sie miedzy nimi przelączac. Nie trzeba przyciagac wtedy tej z zewnatrz do srodka.

A, piszesz ze "reaguje tylko raz" no mozna zrobic tak:

Kod: Zaznacz cały

#jezeli wcisnales jedynke to property zawiera prawde
if klawiatura.events[events.ONEKEY] == status[3]:
    own['sterownik'] = True
#naciskasz "2" property przyjmuje falsz kod na koncu zostaje przerwany   
if klawiatura.events[events.TWOKEY] == status[3]:
    own['sterownik'] = False   
#property zawiera prawde kod dziala nieprzerwanie :)
if own['sterownik'] == True:
    szescian_b.localPosition = own.localPosition


wklejasz to pod wszystkim zamiast tamtego ifa w poprzednim kodzie. To own['sterownik'] to property wlasciciela skryptu u Ciebie to bedzie ten pusty. A no i nie zapomnij o "True Level Triggering" na sensorze always do ktorego dolaczony jest skrypt
Jak to jeszcze nie to co chciales to daj plik :)

Awatar użytkownika
janek
Posty: 237
Rejestracja: 19 lip 2012, 14:23
Lokalizacja: Gdańsk

Re: Copy Location

Postautor: janek » 13 lut 2013, 10:34

Niestety nadal mam ten sam wynik :(

Przysyłam pliczek:
http://www.mediafire.com/?r9xlawb9sq2bhuh

Tym razem ustawiłem Cuba zamiast Kamery bo jest widoczny. Użyłem BMW mike pana bo ciągnika jeszcze nie dostosowałem.
A z ta kamerą to nie chodzi mi ze "z zewnątrz do środka". Będą dwie kamery jedna wewnątrz druga na zewnątrz. Po prostu chciałbym żeby w takich osiach kamera reagowała z ciągnikiem.

Awatar użytkownika
Michalek
Posty: 47
Rejestracja: 01 sie 2012, 19:24

Re: Copy Location

Postautor: Michalek » 13 lut 2013, 20:39

No siedzialem nad tym chyba z godzine :). Ostatnia linijke kodu zmien na to: szescian_b.localPosition = own.worldPosition . Chodzi tylko o own.worldPosition. Bylo local a ma byc world. Widocznie lokalne polozenie dziecka nie zmienia sie gdy podaza ono za rodzicem dlatego trzeba wydobyc z niego polozenie wzgledem globalnego ukladu. Takie banalne a tyle szukania... :)

Awatar użytkownika
janek
Posty: 237
Rejestracja: 19 lip 2012, 14:23
Lokalizacja: Gdańsk

Re: Copy Location

Postautor: janek » 14 lut 2013, 12:16

Michalek wielkie podziękowania dla ciebie i twój wysiłek :D :D :D
Nie jeden nie byłby zdolny odnaleźć taki błąd (a zarazem banalny :P ).
Wszystko teraz działa jak należy w kabinie. Kopiuje LOC i RotZ. :)

Być może rzeczywiście nie było to konieczne i wystarczyło by to zparentować ale ja chciałem pójść krok dalej niż "Farming Simulator" z tą kamerą. Bo tam nie widać jak ciągnik "huleje się" na nierównościach.

W weekend wypuszczę prototyp.

Aktyn
Posty: 18
Rejestracja: 22 wrz 2012, 14:10

Re: Copy Location

Postautor: Aktyn » 14 kwie 2013, 15:03

Da radę przerobić ten skrypt by kopiował nie tylko położenie a także obrót?
Dodać parametr rotation czy coś w tym stylu.


Wróć do „Python”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość