আমি আইওএস-এর জন্য সিনকিট ব্যবহার করে একটি সুইফট অ্যাপ্লিকেশন পেয়েছি 8.. আমি একটি .ডে ফাইল থেকে একটি দৃশ্য লোড করি যা একটি কঙ্কাল দ্বারা নিয়ন্ত্রিত জাল ধারণ করে। রানটাইমের সময়, আমাকে টেক্সচারের স্থানাঙ্কগুলি পরিবর্তন করতে হবে। ট্রান্সফর্ম ব্যবহার করা কোনও বিকল্প নয় - জালের প্রতিটি ভার্টেক্সের জন্য আমার আলাদা, সম্পূর্ণ নতুন ইউভি গুনতে হবে।
আমি জানি যে জ্যামিতি সিনকিতে অপরিবর্তনীয় এবং আমি পড়েছি যে প্রস্তাবিত পদ্ধতিটি হ'ল একটি অনুলিপি তৈরি করতে হবে। আমি এটি করার চেষ্টা করছি, তবে SCNSkinner
কোডটি পুনরায় তৈরি করার চেষ্টা করার সময় আমি সর্বদা ক্রাশ হয়ে যাই । ক্রাশটি একটি EXC_BAD_ACCESS
অভ্যন্তর C3DSourceAccessorGetMutableValuePtrAtIndex
। দুর্ভাগ্যক্রমে, এর জন্য কোনও উত্স কোড নেই, সুতরাং ঠিক কেন এটি ক্রাশ হচ্ছে তা আমি নিশ্চিত নই। আমি এটিকে SCNSkinner
জাল নোডের সাথে সংযুক্ত বস্তুর সাথে সংকুচিত করেছি । যদি আমি সেট না করে থাকি তবে আমি ক্র্যাশ পাই না এবং জিনিসগুলি কাজ করছে বলে মনে হয়।
সম্পাদনা: ক্র্যাশের আরও একটি সম্পূর্ণ কল স্ট্যাক এখানে:
C3DSourceAccessorGetMutableValuePtrAtIndex
C3DSkinPrepareMeshForGPUIfNeeded
C3DSkinnerMakeCurrentMesh
C3DSkinnerUpdateCurrentMesh
__CFSetApplyFunction_block_invoke
CFBasicHashApply
CFSetApplyFunction
C3DAppleEngineRenderScene
...
কীভাবে কোনও SCNSkinner
বস্তু ম্যানুয়ালি তৈরি করা যায় সে সম্পর্কে কোনও নথিপত্র বা উদাহরণ কোড আমি খুঁজে পাইনি । যেহেতু আমি এটি কেবল পূর্ববর্তী কাজের জালের উপর ভিত্তি করে তৈরি করছি, এটি খুব বেশি কঠিন হওয়া উচিত নয়। আমি SCNSkinner
সুইফ্ট ডকুমেন্টেশন অনুসারে তৈরি করছি , সমস্ত সঠিক জিনিসটি ইনকে দিয়ে দিচ্ছি । তবে একটি কঙ্কালের সম্পত্তি রয়েছে SCNSkinner
যে আমি কীভাবে সেট করব তা নিশ্চিত নই। আমি এটি কঙ্কালের সাথে সেট SCNSkinner
করেছিলাম যা আমি অনুলিপি করছি সেই জালটির মূলটিতে যা আমার মনে হয় কাজ করা উচিত ... তবে এটি হয় না। কঙ্কাল সম্পত্তি সেট করার সময়, এটি বরাদ্দ করা হয় না বলে মনে হয়। অ্যাসাইনমেন্টের পরপরই এটি পরীক্ষা করে দেখা যায় যে এটি এখনও শূন্য। পরীক্ষা হিসাবে, আমি জাল জালটির কঙ্কাল সম্পত্তি অন্য কোনও কিছুতে সেট করার চেষ্টা করেছি, এবং কার্যভারের পরে এটিও অচ্ছুত রেখে দেওয়া হয়েছিল।
কি ঘটছে সে সম্পর্কে কেউ আলোকপাত করতে পারে? অথবা কীভাবে সঠিকভাবে কোনও SCNSkinner
বস্তু তৈরি করতে এবং ম্যানুয়ালি সেটআপ করবেন ?
আমি নিজেই একটি জাল ক্লোন করতে এবং একটি নতুন সাথে এটি প্রতিস্থাপন করতে কোডটি ব্যবহার করছি (আমি এখানে উত্সের কোনও ডেটা সংশোধন করি নি - আমি কেবল এই মুহূর্তে একটি অনুলিপি তৈরি করতে পারি তা নিশ্চিত করার চেষ্টা করছি) :
// This is at the start of the app, just so you can see how the scene is set up.
// I add the .dae contents into its own node in the scene. This seems to be the
// standard way to put multiple .dae models into the same scene. This doesn't seem to
// have any impact on the problem I'm having -- I've tried without this indirection
// and the same problem exists.
let scene = SCNScene()
let modelNode = SCNNode()
modelNode.name = "ModelNode"
scene.rootNode.addChildNode(modelNode)
let modelScene = SCNScene(named: "model.dae")
if modelScene != nil {
if let childNodes = modelScene?.rootNode.childNodes {
for childNode in childNodes {
modelNode.addChildNode(childNode as SCNNode)
}
}
}
// This happens later in the app after a tap from the user.
let modelNode = scnView.scene!.rootNode.childNodeWithName("ModelNode", recursively: true)
let modelMesh = modelNode?.childNodeWithName("MeshName", recursively: true)
let verts = modelMesh?.geometry!.geometrySourcesForSemantic(SCNGeometrySourceSemanticVertex)
let normals = modelMesh?.geometry!.geometrySourcesForSemantic(SCNGeometrySourceSemanticNormal)
let texcoords = modelMesh?.geometry!.geometrySourcesForSemantic(SCNGeometrySourceSemanticTexcoord)
let boneWeights = modelMesh?.geometry!.geometrySourcesForSemantic(SCNGeometrySourceSemanticBoneWeights)
let boneIndices = modelMesh?.geometry!.geometrySourcesForSemantic(SCNGeometrySourceSemanticBoneIndices)
let geometry = modelMesh?.geometry!.geometryElementAtIndex(0)
// Note: the vertex and normal data is shared.
let vertsData = NSData(data: verts![0].data)
let texcoordsData = NSData(data: texcoords![0].data)
let boneWeightsData = NSData(data: boneWeights![0].data)
let boneIndicesData = NSData(data: boneIndices![0].data)
let geometryData = NSData(data: geometry!.data!)
let newVerts = SCNGeometrySource(data: vertsData, semantic: SCNGeometrySourceSemanticVertex, vectorCount: verts![0].vectorCount, floatComponents: verts![0].floatComponents, componentsPerVector: verts![0].componentsPerVector, bytesPerComponent: verts![0].bytesPerComponent, dataOffset: verts![0].dataOffset, dataStride: verts![0].dataStride)
let newNormals = SCNGeometrySource(data: vertsData, semantic: SCNGeometrySourceSemanticNormal, vectorCount: normals![0].vectorCount, floatComponents: normals![0].floatComponents, componentsPerVector: normals![0].componentsPerVector, bytesPerComponent: normals![0].bytesPerComponent, dataOffset: normals![0].dataOffset, dataStride: normals![0].dataStride)
let newTexcoords = SCNGeometrySource(data: texcoordsData, semantic: SCNGeometrySourceSemanticTexcoord, vectorCount: texcoords![0].vectorCount, floatComponents: texcoords![0].floatComponents, componentsPerVector: texcoords![0].componentsPerVector, bytesPerComponent: texcoords![0].bytesPerComponent, dataOffset: texcoords![0].dataOffset, dataStride: texcoords![0].dataStride)
let newBoneWeights = SCNGeometrySource(data: boneWeightsData, semantic: SCNGeometrySourceSemanticBoneWeights, vectorCount: boneWeights![0].vectorCount, floatComponents: boneWeights![0].floatComponents, componentsPerVector: boneWeights![0].componentsPerVector, bytesPerComponent: boneWeights![0].bytesPerComponent, dataOffset: boneWeights![0].dataOffset, dataStride: boneWeights![0].dataStride)
let newBoneIndices = SCNGeometrySource(data: boneIndicesData, semantic: SCNGeometrySourceSemanticBoneIndices, vectorCount: boneIndices![0].vectorCount, floatComponents: boneIndices![0].floatComponents, componentsPerVector: boneIndices![0].componentsPerVector, bytesPerComponent: boneIndices![0].bytesPerComponent, dataOffset: boneIndices![0].dataOffset, dataStride: boneIndices![0].dataStride)
let newGeometry = SCNGeometryElement(data: geometryData, primitiveType: geometry!.primitiveType, primitiveCount: geometry!.primitiveCount, bytesPerIndex: geometry!.bytesPerIndex)
let newMeshGeometry = SCNGeometry(sources: [newVerts, newNormals, newTexcoords, newBoneWeights, newBoneIndices], elements: [newGeometry])
newMeshGeometry.firstMaterial = modelMesh?.geometry!.firstMaterial
let newModelMesh = SCNNode(geometry: newMeshGeometry)
let bones = modelMesh?.skinner?.bones
let boneInverseBindTransforms = modelMesh?.skinner?.boneInverseBindTransforms
let skeleton = modelMesh!.skinner!.skeleton!
let baseGeometryBindTransform = modelMesh!.skinner!.baseGeometryBindTransform
newModelMesh.skinner = SCNSkinner(baseGeometry: newMeshGeometry, bones: bones, boneInverseBindTransforms: boneInverseBindTransforms, boneWeights: newBoneWeights, boneIndices: newBoneIndices)
newModelMesh.skinner?.baseGeometryBindTransform = baseGeometryBindTransform
// Before this assignment, newModelMesh.skinner?.skeleton is nil.
newModelMesh.skinner?.skeleton = skeleton
// After, it is still nil... however, skeleton itself is completely valid.
modelMesh?.removeFromParentNode()
newModelMesh.name = "MeshName"
let meshParentNode = modelNode?.childNodeWithName("MeshParentNode", recursively: true)
meshParentNode?.addChildNode(newModelMesh)