Ich versuche, eine einfache App zu machen, wo, wenn Sie auf den Bildschirm tippen, eine Box von schwebend auf die Schwerkraft beeinflusst wird. Ich kann keinen Weg finden, die Box in der Luft schweben zu lassen.Anti-Schwerkraft-Physik in SceneKit
Dieser Code kümmert sich um die Hälfte des Problems:
boxNode.physicsBody = [SCNPhysicsBody dynamicBody];
Dies bewirkt, dass die Box aus der Luft fallen zu lassen und einen Boden schlug ich erstellt. Gibt es etwas in SCNPhysicsBody, das das Gegenteil davon tun würde? Sagen Sie vielleicht, dass Objekte schweben oder einfach zur Decke segeln?
Außerdem habe ich diesen Code geschrieben:
- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer {
if (myBool == false) {
myBool = true;
NSLog(@"true");
} else {
myBool = false;
NSLog(@"false");
}
}
- (void)viewDidLoad
{
[super viewDidLoad];
// touch recognizer
UITapGestureRecognizer *screenTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[self.view addGestureRecognizer:screenTap];
// create box
SCNBox *myBox = [SCNBox boxWithWidth:1.0 height:1.0 length:1.0 chamferRadius:0.1];
SCNNode *boxNode = [SCNNode nodeWithGeometry:myBox];
boxNode.position = SCNVector3Make(0.0, 0.0, 4.0);
[myScene.rootNode addChildNode:boxNode];
while (myBool == true) {
boxNode.physicsBody = [SCNPhysicsBody dynamicBody];
}
}
Ich bin nicht sicher, warum die while-Schleife allerdings nicht funktioniert. Ich dachte, es würde erkennen, dass myBool geändert wurde und ändern Sie die Physik des BoxNode, aber es tut es nicht.
Thank you! Das hilft definitiv. Auf myScene kann nicht über handleSingleTap zugegriffen werden: obwohl myScene in der viewDidLoad deklariert ist. Kann ich es irgendwo anders deklarieren? Entschuldigung, ziemlich neu hier. –
Ach ja, tut mir leid, ich nahm an, du hättest schon 'myScene' als Instanzvariable deklariert. Aktualisiere das obige ... mein Code-Snippet brauchte sowieso ein bisschen Arbeit. – lock
Hinweis: In der bearbeiteten Version deklarieren wir 'myScene' als Instanzvariable in der Klassenschnittstellendefinition. Dann ordnen wir in der 'viewDidLoad'-Methode unsere Szene dieser Variablen zu, so dass sie für alle Funktionen innerhalb der Klasse (und auch anderer Klassen) zugänglich ist. FWIW Wenn ich gerade erst angefangen hätte, würde ich wahrscheinlich direkt zu Swift gehen. – lock