PhysX-Probleme

Posted By: snake67

PhysX-Probleme - 01/26/11 15:25

Hi

Ich habe soeben von A7 auf A8 "geupdated" und die grössten Probleme mit der PhysX-Engine, die ja die ODE-Physik abgelöst hat. Erst mal funktioniert sie ziemlich anders und einiges habe ich bisher mit dem besten Willen und vielen Posts und Hilfeversuche der netten Community einfach nicht hinbekommen. Wohlgemerkt keine neuen Sachen, sondern solche die unter A7 mit ODE problemlos liefen.

In meinem A7-Projekt ist der Player kein Physikobjekt, kann aber mit Physikobjekten interagieren. Bei meiner A8-Portierung hat das nicht funktioniert (die einzigen Änderungen waren zunächst von ODE auf PhysX). Daher habe ich versucht den Player als Physik-Charakter zu steuern, was problemlos geht. Nur ist dann keine Interaktion mit normalen Entities mehr möglich, sie verhalten sich "passable". Wenn ich diese (z.B. kleine) als Physikobjekt mit Eventfunktionen versehe, fallen sie durch das Level. Hier die verschiedenen Lösungsansätze, die bisher alle gescheitert sind:

Strange thing
Strange crash
pXent_settriggerflag Problems

Muss schon sagen, dass ich etwas enttäuscht bin. Da hät ich mir das Update ja eigentlich sparen können...
Posted By: jcl

Re: PhysX-Probleme - 01/26/11 16:16

Lesen Sie hier:

http://manual.3dgamestudio.net/pXent_settype.htm

http://manual.3dgamestudio.net/px_faq.htm

Damit Physik-Objekte mit anderen Objekten interagieren, müssen diese per pXent_settype registriert sein. Dies ist kein Bug, sondern völlig normal. Bevor Sie etwas mit der Physik-Engine machen, schauen Sie einfach kurz ins Handbuch und vor allem in die FAQ und die Beispiele.
Posted By: snake67

Re: PhysX-Probleme - 01/26/11 16:20

Ja. Degen wäre ja nichts einzuwenden. Nur entziehen sie sich der Interaktion gleich beim initialisieren dadurch, das sie in Grund und Boden versinken...
Posted By: jcl

Re: PhysX-Probleme - 01/26/11 16:23

Das nennt man Schwerkraft. laugh
Posted By: snake67

Re: PhysX-Probleme - 01/26/11 16:52

Jaja. Das mit der Schwerkraft habe ich irgendwann auch schon mal gehört... Das Problem ist nicht, dass Objekte herunterfallen, sondern dass sie durch das Level fallen. Aber vielleicht habe ich mich unklar ausgedrückt. Wenn ich ein Objekt folgendermassen initialisiere, funktioniert alles wunderbar, es fällt einfach auf den Boden:
Code:
pXent_settype(me, PH_RIGID, PH_BOX);

Sobald ich jedoch Event-Funktionalität hinzufüge...:
Code:
pXent_settype(me, PH_RIGID, PH_BOX);
pXent_settriggerflag(me, NX_TRIGGER_ON_ENTER, 1);

Dann fällt das Objekt durch den Boden. Das verstehe ich nicht und kann es auch nach öfteren Lesens des Handbuchs und einigen Herumprobierens nicht beheben.
Posted By: TheShooter

Re: PhysX-Probleme - 01/26/11 17:26

Versuch mal den Boden als PhysX Objekt zu definieren.
Posted By: Superku

Re: PhysX-Probleme - 01/26/11 17:36

Der Boden ist "Block".
Ich kann snake67s Problem bestätigen.
Posted By: snake67

Re: PhysX-Probleme - 01/26/11 18:03

TheShooter: Ja, das habe ich auch schon probiert mit:
Code:
level_load(START_LEVEL);
pXent_settype(level_ent, PH_STATIC, PH_POLY | PH_MODIFIED);

Leider ohne Ergebnis.

Superkuh: Aha. Da bin ich aber beruhigt. Jetzt müssten wir das Problem nur noch lösen. Kann ja eigentlich nicht sein, dass da niemand anders drüber gestolpert ist, oder?
Posted By: rojart

Re: PhysX-Probleme - 01/26/11 18:06

Es scheint tatsächlich ein Bug zu sein, hier der geänderte physXtest.c demo mit pXent_settriggerflag funktion.
Alle Bälle sinken in dem boden, anstatt abprallen.

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);
	}
}


Posted By: snake67

Re: PhysX-Probleme - 01/26/11 18:15

Danke. Eine gute Idee, das so zu prüfen. Aber was nun?
Posted By: Superku

Re: PhysX-Probleme - 01/26/11 18:16

Ich hatte dir ja gesagt, du könntest stattdessen pXent_setcollisionflag(...) benutzen (vorerst) (zumindest als Workaround), das funktioniert.
Ich bin mir aber ziemlich sicher, dass dein Problem ein Engine-/ PhysX-Bug ist. Es kann sehr wohl sein, dass es noch keinem aufgefallen ist, denn es gibt/ gab mit der Verwendung von "ackphysX.c" auch noch ein paar Bugs, welche mir bereits begegnet sind/ waren, sofern man sich an seltener genutzte Dinge wagt.
Posted By: snake67

Re: PhysX-Probleme - 01/26/11 19:03

Ja. Habe ich auch schon probiert. Ich will ja, dass der Player drüberlaufen kann und damit einen Event auslöst. Das geht aber mit "pXent_setcollisionflag" irgendwie auch nicht.
Posted By: Superku

Re: PhysX-Probleme - 01/26/11 20:53

Doch, genau das geht:

Click to reveal..
Code:
#include <acknex.h>
#include <default.c>
#include <ackphysX.h>


void po_event() {
	my.event = NULL;
	wait(1);
	beep();
	ptr_remove(me);
}


action physics_object() {
	while(!player) { wait(1); }
	pXent_settype(me, PH_RIGID, PH_BOX);
	pXent_setcollisionflag(me, player, NX_NOTIFY_ON_START_TOUCH);
	my.event = po_event;
}

action player_act() {
	player = me;
	pXent_settype(me, PH_CHAR, PH_CAPSULE);
	wait(1);
	while(1) {
		pXent_movechar(me, vector(15*(key_w-key_s)*time_step,0,-5*time_step), NULL, 0);
		camera.x = my.x-100;
		wait(1);
	}
}


void main() {
	pX_setgravity(vector(0, 0, -9.81));
	physX_open();
	level_load("snake.wmb");
	ent_create(CUBE_MDL,camera.x,player_act);
}


Posted By: snake67

Re: PhysX-Probleme - 01/27/11 14:56

Ja. Ich habe ein kleines Objekt und es "höher gelegt": jetzt geht es. Wie aber kann nun der "trigger_range" vergrössert werden? Durch Vergrössern der Kollisionshülle?

Ach ja und das Trigger-Problem? Ist es vielleicht doch ein Bug? Ich kann das Durchfallen der Kugeln nach Beispielcode von rojart bestätigen. Sie, JCL?
© 2024 lite-C Forums