PDA

View Full Version : Expresso Eenvoudig, deel 07


roobol
16th April 2011, 11:23
Het vervolg op de schakelaars, maar nu iets lastiger; het maken van logische constructies.

En ik heb er ook eens een deftige lichtopstelling bijgestoken :-)

Rich_Art
16th April 2011, 11:24
Lol gaat lekker zo zeg. :) Thanks.

Peace,
Rich_Art. :v:

Rego
16th April 2011, 12:44
Het vervolg op de schakelaars, maar nu iets lastiger; het maken van logische constructies.

En ik heb er ook eens een deftige lichtopstelling bijgestoken :-)


Da's een oudje :)

http://www.biorust.com/tutorials/detail/93/en/

Rich_Art
16th April 2011, 12:58
De gebruikte nodes zijn natuurlijk al vele malen gebruikt door tutorial makers. :)
Neemt niet weg dat dit een fijne cursus is die je meeneemt op Xpresso expeditie.

Peace,
Rich_Art. :v:

roobol
16th April 2011, 14:53
Dit is een zo'n klassieker die waarschijnlijk al vele malen is uitgevonden :-)

De expressie in de link ziet er wat vreemd uit. De absolute node dient om negatieve getallen positief te maken, maar die hebben geen input zodat de uitkomst altijd 0 zal zijn. Verder is die XOR (exclusive OR, alleen A, of B , maar niet A en B) eigenlijk niet nodig.

Sluiten kan met eenvoudige NOT constructie en zelf gebruik ik liever een middenstop en een symmetrie, dan is het in elkaar schuiven van de deurhelften makkelijker te corrigeren.

douwe
16th April 2011, 16:27
toen ik het zelf ooit voor het eerst op eigen kracht probeerde, geraakte ik er met een paar omwegen die best wel vergezocht zijn, maar daarom niet minder interessant.
ik maakte bv. zelf een soort switch met een Light.

zie bijlage.

nu de vraag die het écht interessant maakt :
wie krijgt het eerst het deur-mechanisme van kees voor mekaar met 1 enkele coffee of python-tag ? met een 3-tal if-statements en een koppel variabelen moet dat kunnen lukken.

er lopen er hier een paar rond die al hebben laten vallen dat ze daartoe in staat zouden zijn.
de eerste die een voorbeeldje uploadt, krijgt van mij een handjevol respect.


succes,
d

roobol
17th April 2011, 07:44
Dat is inderdaad een leuke aanpak waar je inderdaad een XOR voor nodig hebt. Voor die absolute zou ik eerder een constant node met een waarde 0 gebruikt hebben.

De absolute node is bijvoorbeeld handig om in combinatie met een sinus functie een bal te laten stuiteren (en dan de hoogte dempen met de state poort van een monoflop :-)

Die coffee/python uitdaging laat ik voorlopig even liggen; de talen waarin ik heb leren programmeren bestaan niet meer :-/

douwe
17th April 2011, 14:40
roobol deed het met cobol ? ;)

inderdaad, het gebruik van de Absolute node is een vreemde keuze.
ik denk dat ik me er indertijd niet eens van bewust was dat de Constant node überhaupt bestond.


over die coffee / python-uitdaging :
- open "schuifdeuren.c4d" uit de xpresso-les.
- verwijder de xpresso-tag
- selecteer het "deur" Object in de Object Manager en voeg een COFFEE Tag toe (rechtsklik / C4D Tags / COFFEE)
- dubbelklik op de COFFEE Tag om de Expression Editor te openen.
- copy / paste er de volgende lijntjes code in
- klik Compile bovenaan de Editor
- press Play
;)

het kan simpeler en met een stuk minder code ,
maar op deze manier is het wel zeer duidelijk leesbaar.

var speed = 0; //snelheid
var open = 0; // deurtje is niet open
var doorlimit = 210; // hoe ver kan de deur max open
var bollimit = 250; // max afstand tussen axis bol en axis detector om event te triggeren

main(doc,op)
{

// berekent de afstand tussen bol & detector :
var obj1 = doc->FindObject("bol")->GetMg()->GetV0(); // waar bevindt zich de bol
var obj2 = doc->FindObject("detector")->GetMg()->GetV0(); // waar bevindt zich de detector
var dist = vlen(obj2 - obj1); // hoeveel afstand zit daartussen ?

// controleert de deur :
var pos = op->GetPosition(); // waar bevindt zich de deur ?
pos.x = pos.x += speed; // tel de snelheid bij positie van de deur

// als de bol NIET wordt gedecteerd
if (dist > bollimit)
{
if (open==TRUE) // als de deur reeds open is
{
speed = -10; // wordt de snelheid -10
if(pos.x < 10) //tot waar de deur dicht is.
{
pos.x = 0; // en daar blijft hij staan
open = FALSE; // /en de deur is dicht
}
}
else if (open==FALSE) // als de deur dicht is
{
speed = 0; // blijft hij dicht
}
}
// als de bol WEL wordt gedecteerd
else if (dist < bollimit)
{
speed = 30; // wordt de snelheid 30
if(pos.x > doorlimit) // tot aan de deurlimiet
{
pos.x = doorlimit; // en daar blijft hij staan
open = TRUE; //en de deur is open
}
}

op->SetPosition(pos); // voert de actie uit
}

wie doet het met veel minder code ?
wie doet het met python ?
schroom u niet en waag uw kans.

ikzelf weet niets van programmeren, (heb hoogstens met een paar scripttalen geflirt),
dus ik leer graag bij van iemand met verstand van zaken.

zo'n scriptje in mekaar steken is een erg leuk en leerrijk spelletje,
en ik heb nog een paar handjesvol respect op overschot !
consider yourself challenged.

groetjes,
douwe

Marijn
18th April 2011, 08:55
Bedankt voor de tutorials Kees!

@douwe: zelf in elkaar geknutseld? Helemaal niet slecht hoor, lijkt me prima code. Eén puntje om misschien op te letten is dat je de situatie dist == bollimit negeert. Maw: wanneer deze exact gelijk zijn (zeer onwaarschijnlijk) worden geen statements uitgevoerd. Beter zou dus zijn om af te sluiten met else if (dist <= bollimit) ; nog beter is gewoonweg de "else" statement die automatisch alles pakt dat niet gold voor de if statement. Zo ben je zeker dat je alles hebt zonder dat je erover hoeft na te denken, én is je code compacter. Bij je boolean doe je hetzelfde, ook daar is een enkele "else" genoeg.

douwe
18th April 2011, 12:55
je hebt gelijk marijn.
dat is onnauwkeurig en slordig.
gewoon else gebruiken ipv else if maakt dat je minder voorwaarden moet vastleggen.


var speed = 0; //snelheid
var open = 0; // deurtje is niet open
var doorlimit = 210; // hoe ver kan de deur max open
var bollimit = 250; // max afstand tussen axis bol en axis detector om event te triggeren

main(doc,op)
{

// berekent de afstand tussen bol & detector :
var obj1 = doc->FindObject("bol")->GetMg()->GetV0(); // waar bevindt zich de bol
var obj2 = doc->FindObject("detector")->GetMg()->GetV0(); // waar bevindt zich de detector
var dist = vlen(obj2 - obj1); // hoeveel afstand zit daartussen ?

// controleert de deur :
var pos = op->GetPosition(); // waar bevindt zich de deur ?
pos.x = pos.x + speed; // tel de snelheid bij positie van de deur

// als de bol NIET wordt gedecteerd
if (dist > bollimit)
{
if (open==TRUE) // als de deur reeds open is
{
speed = -10; // wordt de snelheid -10
if(pos.x < 10) //tot waar de deur dicht is.
{
pos.x = 0; // en daar blijft hij staan
open = FALSE; // en de deur is dicht
}
}
else // als de deur dicht is
{
speed = 0; // blijft hij dicht
}
}
// als de bol WEL wordt gedecteerd
else
{
speed = 30; // wordt de snelheid 30
if(pos.x > doorlimit) // tot aan de deurlimiet
{
pos.x = doorlimit; // en daar blijft hij staan
open = TRUE; //en de deur is open
}
}

op->SetPosition(pos); // voert de actie uit
}


dit is mijn eerste echte coffee,ja.
heb wel al een aantal keer in coffee nodes if statements nodig gehad, maar dit is mijn eerste zelfgebrande coffee in de coffee tag.
plezant spelleke.

douwe

roobol
18th April 2011, 14:50
"roobol deed het met cobol ? "

Een beetje Cobol, maar vooral Pascal, en natuurlijk Basic :-)

Rich_Art
18th April 2011, 15:35
En van dropjes houd ik ook. :beach:

Peace,
Rich_Art. :v:

roobol
19th April 2011, 08:59
Da's nie goe voor de lijn, René :-)

Die syntax ziet er niet al te intimiderend uit, lijkt me zeker de moeite om eens mee te gaan experimenteren.

Rich_Art
19th April 2011, 09:06
Nee dat klopt . :) ik heb dan ook een te dikke buik. Ben nu grote vriend van Omega 3 geworden.

Peace,
Rich_Art. :v:

douwe
19th April 2011, 13:41
Die syntax ziet er niet al te intimiderend uit, lijkt me zeker de moeite om eens mee te gaan experimenteren.

het kan natuurlijk een stuk compacter en intimiderender, maar ik heb het zo leesbaar mogelijk gehouden. de syntax op zich is erg eenvoudig en logisch. dat is het voordeel van al die scripttalen van tegenwoordig, daar kan je bijna in babbelen.

ook in xpresso kan een coffee node voor simpele if statements je een hoop nodes besparen.

d

ik zou ditzelfde bij gelegenheid ook graag eens in python uitzoeken.

douwe
24th October 2011, 15:23
ik zou ditzelfde bij gelegenheid ook graag eens in python uitzoeken.

ben me wat meer in python gaan verdiepen, ik wist dat ik deze uitdaging nog had openstaan, dus het is er eindelijk van gekomen.

- neem het bestandje van kees uit de oorspronkelijke post.
- voeg een Python Tag toe aan "deur"
- paste deze code in de Tag
- Compile het
- en voilà.

import c4d

speed=0
opened=0
doorlimit = 210
bollimit = 250

obj = op.GetObject()
obj1 = doc.SearchObject("bol")
obj2 = doc.SearchObject("detector")

#reset deur at 0
frame = doc.GetTime().GetFrame(doc.GetFps())
if frame==0:
obj.SetAbsPos(c4d.Vector(0,0,0))

def sesam():
global speed
global opened

mat1 = obj1.GetMg().off
mat2 = obj2.GetMg().off
dist = (mat2-mat1).GetLength()
pos = obj.GetAbsPos();

if dist > bollimit:
if opened:
speed = -10
if pos.x < 10:
pos.x = 0
speed = 0
opened = 0
else:
speed = 0
else:
speed = 30
if pos.x > doorlimit:
pos.x = doorlimit
opened = 1

posx = pos.x + speed
obj.SetAbsPos(c4d.Vector(posx,0,0))

def main():
sesam()

ben nogal een maagd in python, dus als iemand ideeën heeft om de code compacter en efficiënter te krijgen, hoor ik het heel graag.

d

Rich_Art
24th October 2011, 15:53
Ha cool... Ik zal dat eens gaan proberen vanavond. :-)

Thanks.

Peace,
Rich_Art. :v: