PhysX

Posted By: snake67

PhysX - 01/28/11 03:32

Hi

Nochmals in diesem Forum. Wenn bei PhysX-Modellen die Triggerung mit "pXent_settriggerflag" gesetzt ist, fallen sie durch das Level.

rojart hat die PhysX-Demo "physXtest.c" aus dem Ordner "samples" abgeändert. Bei den Kugeln wird im Gegensatz zu den Würfeln das "pXent_settriggerflag" gesetzt und (nur) sie fallen durch das Level. Hier ist der Code:

Code:
//////////////////////////////////////////////////////
// PhysX stress test
// (c) jcl / oP group 2010
//////////////////////////////////////////////////////
#include <default.c>
#include <ackphysx.h>
function EventTrigger()
{
        reset(my,TRANSLUCENT); //to visualize the collision
        pX_setforcemode(NX_FORCE);
        pXent_addexplosion(you,my.x,500,my.max_x/2); // you is the entity that collides with the trigger object
        wait(4);
        set(my,TRANSLUCENT);
        vec_set(my.blue,COLOR_BLACK);
}

// convert entity to a PhysX actor
function actor(type)
{
	set(my,LIGHT|CAST);
	if (num_entities < 250) set(my,SHADOW); 
	// set random size
	vec_fill(my.scale_x,0.6+random(0.4));
	// activate physics	
	pXent_settype(my,PH_RIGID,type);
	pXent_setelasticity(my,90);
	pXent_setccdskeleton(me, vector(0.2, 0.2, 0.2), 1);
	
	// set random initial speed	
	pXent_addvelcentral(my,vector(1-random(2),1-random(2),0));
	// remove entity when fallen over the edge of the ground plate
	while(1) {
		if (my.z < 0) { 
			ent_remove(me);
			return; 
		}
		wait(1);
	}
}

function ball()
{
	my.material = mat_metal;
	vec_set(my.blue,vector(0,random(100),150+random(100)));
	actor(PH_SPHERE);
	pXent_settriggerflag(my, NX_TRIGGER_ON_ENTER , 1);
	my.event = EventTrigger;
}

function cube()
{
	vec_set(my.blue,vector(150+random(100),random(100),0));
	actor(PH_BOX);
	pXent_setfriction(my,0); // ice cube
}

function main()
{
	shadow_stencil = 3;
	d3d_antialias = 4;
	max_entities = 3000;
	physX_open();
	pX_setccd(1);
	level_load(""); // load empty level
	vec_set(camera.x,vector(-380,0,80));

	// create ground plate
	ENTITY* ground = ent_create(CUBE_MDL,vector(0,0,0),NULL);
	vec_set(ground.scale_x,vector(20,20,1));
	pXent_settype(ground,PH_STATIC,PH_BOX); 
	pXent_setfriction(ground,10);
	
	// endlessly create entities	
	while(1){
		ent_create(SPHERE_MDL,vector(random(20),random(20),150),ball);
		if (random(100) > 70) ent_create(CUBE_MDL,vector(random(20),random(20),170),cube);
		wait(-0.05);
	}
}



Was liegt hier wohl vor?
Posted By: jcl

Re: PhysX - 01/28/11 10:12

Ich weiss nicht genau, was Sie vorhaben, aber Sie können keine Triggerzonen durch Ihr Level kullern lassen. Eine Triggerzone ist ein fester Bereich im Level, in dem ein Trigger ausgelöst wird.

Lesen Sie hier: http://manual.3dgamestudio.net/pXent_settriggerflag.htm

Triggerzonen sind ein spezielles Feature der PhysX. Ich habe sie selbst noch nicht ausprobiert, aber Ihr Code oben macht für mich wenig Sinn. Um Ihre Triggerzone zu testen, brauchen Sie einen Actor, der hineinmarschiert. Also, zurück ins Physikforum.
Posted By: rojart

Re: PhysX - 01/28/11 15:48

Also, laut PhysX Dokumentation, sollte beides funktionieren. Dynamische und kinetische Trigger funktionieren nur mit dem unterschied das der kinetische Trigger ganz durch andere Objekte durchläuft, jedoch Dynamische Trigger mit statischen Objekten weg prallen sollten.
Dies zeigt, dass Dynamische Trigger funktionieren in der Acknex PhysX Engine nur kinetisch.
Ich werde noch heute das Beispiel zukommen lassen, dann können Sie sich das ganze in ruhe anschauen wie es funktioniert, oder wenn möglich schauen Sie sich das SampleTrigger von der PhysX Beispielen an.

Originally Posted By: jcl
Ich habe zwar Triggerzonen selbst noch nicht ausprobiert, aber Ihr Code oben macht für mich wenig Sinn.

Als Beispiel:
Wie wäre es, wenn ich mit einem Gegenstand als Stein (Dynamischen Trigger) mit anderen Objekt einen Event auslösen möchte und der Stein dann sogar abprallen sollte?

Originally Posted By: jcl
Ich weiss nicht genau, was Sie vorhaben, aber Sie können keine Triggerzonen durch Ihr Level kullern lassen. Eine Triggerzone ist ein fester Bereich im Level, in dem ein Trigger ausgelöst wird.

Nicht vergessen das PhysX Engine eine Vielfalt von mehreren Möglichkeiten eine Lösung hat, in diesem fall dynamische und kinetische Trigger.
Posted By: snake67

Re: PhysX - 01/29/11 07:46

Aha, das war die Krux.
Ich bin zuerst davon ausgegangen, dass die Implementierung von PhysX in A8 das Eventhandling zwischen Physik-Entities und normalen Entities genauso erlaubt wie ODE in A7. Das war falsch.
Na gut, dann halt nur zwischen Physik-Entities. Jetzt ist mir klar, dass auch da nicht alles geht...
Auch wenn das alles "normal" ist, die Funktionalität und die Möglichkeiten scheinen mir in A8 mit PhysX gegenüber A7 mit ODE irgendwie eingeschränkt. Nicht gut...
Posted By: Dark_samurai

Re: PhysX - 01/29/11 12:35

Im Forecast ist geplant, dass die normale Kollisionserkennung durch PhysX ersetzt wird. Dann sollten alle Entities wieder gegenseitig Events auslösen können, oder?
Posted By: rojart

Re: PhysX - 01/29/11 14:29

Danke für den Hinweis, ich hoffe das es dann richtig funktioniert und nicht nur teilweise.
© 2024 lite-C Forums