2017-09-06 3 views
2

Je suis très nouveau dans le monde de la scène et du développement 3d en général et je suis en train de jouer avec ARKit et essayer d'adapter une texture à un plan (bien une scnbox mais seulement la surface supérieure) et aussi de ne pas trouver quelque chose d'utile sur le web.Comment adapter une texture à une surface? ARKit SceneKit Swift

J'ai une texture d'une route qui est une très longue image png rectangulaire. largeur: le rapport de taille est environ 20: 1

Je veux appliquer cette texture à la surface d'une table, une fois que arkit a trouvé l'avion pour moi. Je ne connais pas les dimensions de la table avant le démarrage de l'application.

Je peux actuellement appliquer une texture à ce plan, et également faire pivoter la texture comme désiré. Ce que je voudrais accomplir est d'étirer la texture (en gardant le rapport original) de sorte que les côtés courts du plan et la texture s'alignent et alors la texture continue jusqu'à la fin de l'avion, en coupant ou en répétant selon le la longueur ou le rapport de l'avion.

Voici la fonction qui obtient l'objet ScnMaterial

class func getRunwayMaterial() -> SCNMaterial { 
    let name = "runway" 
    var mat = materials[name] 
    if let mat = mat { 
     return mat 
    } 
    mat = SCNMaterial() 
    mat!.lightingModel = SCNMaterial.LightingModel.physicallyBased 
    mat!.diffuse.contents = UIImage(named: "./Assets.scnassets/Materials/runway/runway.png") 
    mat!.diffuse.wrapS = SCNWrapMode.repeat 
    mat!.diffuse.wrapT = SCNWrapMode.repeat 
    materials[name] = mat 
    return mat! 
} 

Ceci est la fonction qui devrait faire la mise à l'échelle et la rotation de la texture sur le plan.

func setRunwayTextureScale(rotation: Float? = nil, material: SCNMaterial? = nil) { 
    let texture = material != nil ? material! : planeGeometry.materials[4] 
    var m: SCNMatrix4 = SCNMatrix4MakeScale(1, 1, 1) 
    if(rotation != nil){ 
     textureRotation = rotation! + textureRotation 
    } 
    m = SCNMatrix4Rotate(m, textureRotation, 0, 1, 0) 
    texture.diffuse.contentsTransform = m 
} 

S'il vous plaît me aider à remplir les blancs ici, et si quelqu'un a des liens ou des articles sur la façon de faire ce genre de manipulation s'il vous plaît me relier!

Merci! Ethan

modifier: BTW J'utilise Xcode 9

Répondre

0

Essayez d'utiliser:

material.diffuse.wrapS = SCNWrapModeRepeat; 
material.diffuse.wrapT = SCNWrapModeRepeat; 

Cela aiderait le matériel n'étirer, mais simplement continuer à ajouter de plus en plus de la même .png à lui-même .

Vous pouvez également définir l'échelle de la matière en la plaçant sur une largeur et hauteur:

CGFloat width = self.planeGeometry.width; 
    CGFloat height = self.planeGeometry.length; 

    material.diffuse.contentsTransform = SCNMatrix4MakeScale(width, height, 1); 

Désolé, je travaille avec Objective C ici, mais devrait être assez facile à traduire.

se trouvent également quelques bons tutoriels sur ce lien:

https://blog.markdaws.net/apple-arkit-by-example-ef1c8578fb59