Dienstag, 6. Dezember 2016

Animate / Fade Intensity

let animation2 = CAKeyframeAnimation()
animation2.keyPath = "geometry.firstMaterial.diffuse.intensity"
animation2.values   =  [2, 0.2, 0.1, 0]
animation2.keyTimes =  [0, 0.5, 0.9, 3]
animation2.duration =  3
animation2.isAdditive = false

self.addAnimation(animation2, forKey: "test2")

Variable im Printtext


Jedesmal muss ich nachgucken. Deshalb schreibe ichs mir hier nieder:

print("Variable: \(variable)")

Mittwoch, 30. November 2016

Scenekit Call Action Every Frame

// ----------------------------
// PER FRAME CODE HERE
// ----------------------------
func renderer(_ aRenderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
        // per-frame code here 
        
}


--- snip ---

// Diese zwei Zeilen sind notwendig um einen Handler 
// für jedes Frame zu bekommen
// Ohne playing updated er offensichtlich das Bild nur bei Änderungen...
// Diese Methode geht übrigens voll auf die CPU und die Batterie !!
// und kann gar nicht wirklich empfohlen werden...

scnView.delegate  = self

scnView.isPlaying = true


--- snip ---


SWIFT / SCENEKIT: A SCNNODE removes itself after

// ------------------------------------------------------------------------
// Die SCNNODE entfernt sich nach Zeit selber aus dem Scenegraph
// Ich hoffe SWIFT´s  removeFromParentNode() räumt selber vernünftig auf...
// ------------------------------------------------------------------------
let waitaction   = SCNAction.wait(duration: TimeInterval(<lifetime>))
let removeaction = SCNAction.removeFromParentNode()
let sequence     = SCNAction.sequence([waitaction, removeaction])

<SCNNODE>.runAction(sequence)

Move UV Mapping of a 3D geometry

// Das UV Mapping einer 3D Node skalieren
self.geometry?.firstMaterial?.diffuse.contentsTransform = SCNMatrix4MakeScale(0.1, 0.1, 0)



// Das UV Mapping einer 3D Node verschöben

self.geometry?.firstMaterial?.diffuse.contentsTransform = SCNMatrix4MakeTranslation(0.1, 0.1, 0)

Dienstag, 29. November 2016

Animate UVs / Animate Texture for a SpriteAtlas / Flipbook effekt

let spriteatlasanimation = CAKeyframeAnimation()
        
// We do not directly animate UV´s but a matrix instead that moves the
// UV´s across the texture space
spriteatlasanimation.keyPath = "geometry.firstMaterial.diffuse.contentsTransform"

let pos0 = SCNMatrix4MakeTranslation(0.0, 0.0, 0)
let pos1 = SCNMatrix4MakeTranslation(0.1, 0.1, 0)
let pos2 = SCNMatrix4MakeTranslation(0.2, 0.2, 0)
let pos3 = SCNMatrix4MakeTranslation(0.3, 0.3, 0)
let pos4 = SCNMatrix4MakeTranslation(0.4, 0.4, 0)
let pos5 = SCNMatrix4MakeTranslation(0.5, 0.5, 0)
let pos6 = SCNMatrix4MakeTranslation(0.6, 0.6, 0)
let pos7 = SCNMatrix4MakeTranslation(0.7, 0.7, 0)
let pos8 = SCNMatrix4MakeTranslation(0.8, 0.8, 0)
let pos9 = SCNMatrix4MakeTranslation(0.9, 0.9, 0)

spriteatlasanimation.values   =  [pos0, pos1, pos2, pos3,  pos4,  pos5,  pos6,  pos7,  pos8,  pos9]
spriteatlasanimation.keyTimes =  [0, 0.10.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
spriteatlasanimation.duration0.5
spriteatlasanimation.isAdditive = false
        
// No Interpolation required for Flipbook effect : kCAAnimationDiscrete
spriteatlasanimation.calculationMode = kCAAnimationDiscrete
spriteatlasanimation.repeatCount = .infinity


<SCNNODE>.addAnimation(spriteatlasanimation, forKey: "test3")

SWIFT 3 SCENEKIT IOS SCNGeometry Geometrie von Hand erzeugen.

func Quad() -> SCNGeometry {

    let verticesPosition = [
        SCNVector3Make( -2, -2, 3),
        SCNVector3Make2, -2, 3),
        SCNVector3Make22, 3),
        SCNVector3Make( -22, 3)
    ]
    let textureCord =    [CGPoint(x: 0.0,y: 0.1),
                          CGPoint(x: 0.1,y: 0.1),
                          CGPoint(x: 0.1,y: 0.0),
                          CGPoint(x: 0.0,y: 0.0)]
    
    let indices: [CInt] = [
        0, 2, 3,
        0, 1, 2
    ]
    
    let vertexSource = SCNGeometrySource(vertices: verticesPosition, count: 4)
    let srcTex = SCNGeometrySource(textureCoordinates: textureCord, count: 4)
    let date = NSData(bytes: indices, length: MemoryLayout<CInt>.size * indices.count)
    
    let scngeometry = SCNGeometryElement(data: date as Data, primitiveType: SCNGeometryPrimitiveType.triangles, primitiveCount: 2, bytesPerIndex: MemoryLayout<CInt>.size)
    
    let geometry = SCNGeometry(sources: [vertexSource,srcTex], elements: [scngeometry])

    return geometry


}

Blog Neugeburt und Umwindmung : Swift 3 / Scenekit / IOs Beispiele

Seit einem Jahr bastele ich in Swift auf dem iPhone an einer App. 
Ich will meine Programmierkenntnisse auffrischen, außerdem macht das Spaß. Ich habe mich für Swift entschieden, weil ich gern auf dem iPhone arbeiten wollte und mir Unity und andere Engines zu fett und groß waren. Ich will eher programmieren, weniger drag und droppen. 
Das Apple das verrufene Objective C durch etwas moderneres ersetzen will, klang vor  12 Monaten sehr gut für mich - vlt isses das auch. 
Aber...

...dummerweise hat Swift einige erhebliche Probleme, die es einem Programmier-Dilettanten wie mir drastisch erschweren, in Swift nach den Playground Basics voranzukommen.
  • Swift ändert sich ständig von Version zu Version (also alle 6 Monate). Apple scheint nach der idealen Programmiersprache zu suchen und scheut sich dabei nicht - wesentliche Elemente der Syntax und Funktionen über Bord zu werfen oder komplett umzubauen. Das führt dazu dass die meisten Programmierbeispiele die man im Netz findet, nicht out of the Box funzen, weil sie von einer alten Version stammen. Das kann superfrustrierend sein.
  • Swift hat sich bei der Suche nach der idealen Programmiersprache in einige ziemlich verwinkelt, elaborierte verwinkelte Elfenbeinprobleme vermurkelt - die der Sprache einige eigentümliche Schnörkel verleihen.
  • Swift hat vor allem im 3D Bereich (also Scenekit) noch keine wirkliche Reichweite (verglichen zB mit Unity) - entsprechend rar machen sich Beispiele. Meistens findet man beim Googeln Scenekit Beispiele in C - und muss sie dann irgendwie "übersetzen". 
  • Die immer selben Tutorials im einfachen Einsteiger Bereich gibt es wie Sand am Meer - aber sobald man spezifisches braucht, wird es ganz schnell dünn.
  • Alles das gilt auch für Bücher und Tutorials die man kaufen kann: die Hälfte der Beispiele funzen nicht, gehen nicht ins Detail oder sind in C.
Wenn man sich durchbeißt, macht es doch ganz gut Spaß. Sehr vieles geht wirklich sehr gut und leicht.

Daher schnappe ich mir mal meinen alten Blog - wo ich 2010 gerade mal drei Posts gemacht habe und fülle stattdessen mal paar praktische SWIFT Beispiele ein. Einfach um bestimmte Patterns, Methoden und Syntax auch für mich selber zu speichern. Vlt isses auch für jemand anderen hilfreich.