0 registered members (),
1,094
guests, and 1
spider. |
Key:
Admin,
Global Mod,
Mod
|
|
|
PhysX-Probleme
#355319
01/26/11 15:25
01/26/11 15:25
|
Joined: Sep 2003
Posts: 648 Switzerland
snake67
OP
User
|
OP
User
Joined: Sep 2003
Posts: 648
Switzerland
|
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 thingStrange crashpXent_settriggerflag ProblemsMuss schon sagen, dass ich etwas enttäuscht bin. Da hät ich mir das Update ja eigentlich sparen können...
|
|
|
Re: PhysX-Probleme
[Re: jcl]
#355339
01/26/11 16:52
01/26/11 16:52
|
Joined: Sep 2003
Posts: 648 Switzerland
snake67
OP
User
|
OP
User
Joined: Sep 2003
Posts: 648
Switzerland
|
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:
pXent_settype(me, PH_RIGID, PH_BOX);
Sobald ich jedoch Event-Funktionalität hinzufüge...:
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.
|
|
|
Re: PhysX-Probleme
[Re: Superku]
#355366
01/26/11 18:03
01/26/11 18:03
|
Joined: Sep 2003
Posts: 648 Switzerland
snake67
OP
User
|
OP
User
Joined: Sep 2003
Posts: 648
Switzerland
|
TheShooter: Ja, das habe ich auch schon probiert mit:
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?
|
|
|
Re: PhysX-Probleme
[Re: Superku]
#355367
01/26/11 18:06
01/26/11 18:06
|
Joined: Oct 2004
Posts: 900 Lgh
rojart
User
|
User
Joined: Oct 2004
Posts: 900
Lgh
|
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.
//////////////////////////////////////////////////////
// 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);
}
}
|
|
|
|