2012-08-07 20 views
9

मैं अजगर में शुरू हो रही राइनो से बनाए गए 3D जाल voxelize (जो मैं लगभग कुछ भी नहीं पता की) पर मदद की ज़रूरत voxelize। डेटा इनपुट एक ओबीजे फ़ाइल होगी और आउटपुट भी होगा। इस उपयोग के लिए अंतिम उद्देश्य एक इमारत के भीतर दो बिंदुओं के बीच सबसे छोटी दूरी को ढूंढना है। लेकिन यह बाद में है। अभी के लिए, मुझे पहले एक 3 डी जाल voxelize करने की जरूरत है। Voxelization primitive सिर्फ एक साधारण घन हो सकता है।अजगर में, कैसे करना है मैं एक 3 डी जाल

अब तक मैं एक ओबीजे फ़ाइल पार्सर से और वी, वीटी, वीएन, एफ उपसर्गों के साथ पार्स किए गए ओबीजे से बाहर पढ़ सकता हूं, और 3 डी ऑब्जेक्ट के बाध्यकारी बॉक्स को खोजने के लिए उन निर्देशांकों का उपयोग कर सकता हूं। जाल को voxelize करने के लिए सही तरीका क्या होना चाहिए?

import objParser 
import math 

inputFile = 'test.obj' 
vList = []; vtList = []; vnList = []; fList = [] 

def parseOBJ(inputFile): 
list = [] 
vList, vtList, vnList, fList = objParser.getObj(inputFile) 
print 'in parseOBJ' 
#print vList, vtList, vnList, fList 
return vList, vtList, vnList, fList 

def findBBox(vList): 
    i = 0; j=0; x_min = float('inf'); x_max = float('-inf'); y_min = float('inf'); 
    y_max = float('-inf'); z_min = float('inf'); z_max = float('-inf'); 
    xWidth = 0; yWidth = 0; zWidth =0 

print 'in findBBox' 
while i < len(vList): 
     #find min and max x value 
     if vList[i][j] < x_min: 
      x_min = float(vList[i][j]) 
     elif vList[i][j] > x_max: 
      x_max = float(vList[i][j]) 

     #find min and max y value 
     if vList[i][j + 1] < y_min: 
      y_min = float(vList[i][j + 1]) 
     elif vList[i][j + 1] > y_max: 
      y_max = float(vList[i][j + 1]) 

     #find min and max x value 
     if vList[i][j + 2] < z_min: 
      z_min = vList[i][j + 2] 
     elif vList[i][j + 2] > z_max: 
      z_max = vList[i][j + 2] 

     #incriment the counter int by 3 to go to the next set of (x, y, z) 
     i += 3; j=0 

xWidth = x_max - x_min 
yWidth = y_max - y_min 
zWidth = z_max - z_min 
length = xWidth, yWidth, zWidth 
volume = xWidth* yWidth* zWidth 
print 'x_min, y_min, z_min : ', x_min, y_min, z_min 
print 'x_max, y_max, z_max : ', x_max, y_max, z_max 
print 'xWidth, yWidth, zWidth : ', xWidth, yWidth, zWidth 
return length, volume 

def init(): 
    list = parseOBJ(inputFile) 
    findBBox(list[0]) 

print init() 

उत्तर

6

मैं इसे इस्तेमाल नहीं किया है, लेकिन आप इस एक कोशिश कर सकते हैं: http://packages.python.org/glitter/api/examples.voxelization-module.html

या इस उपकरण: http://www.patrickmin.com/binvox/

क्या आप दो मुख्य दृष्टिकोण है अपने आप से यह करने के लिए करना चाहते हैं:

  • एक 'असली' voxelization, जब आप खाते में जाल आंतरिक ले - जटिल और आप CSG आपरेशन के बहुत जरूरत है। मैं आपकी मदद नहीं कर सकता
  • एक 'नकली' - बस अपने जाल के हर त्रिकोण को voxelize। यह बहुत आसान है, आपको केवल त्रिभुज और अक्ष-संरेखित घन के चौराहे की जांच करने की आवश्यकता है। तो फिर तुम सिर्फ कार्य करें:

    for every triagle: 
        for every cube: 
         if triangle intersects cube: 
          set cube = full 
         else: 
          set cube = empty 
    

तुम सब करने की ज़रूरत है एक BoundingBox-त्रिभुज चौराहे लागू करने के लिए है। आप लूप के लिए उनको अनुकूलित कर सकते हैं :)

+2

बिनवोक्स [इस स्थान] में स्थानांतरित हो गया है (http://www.patrickmin.com/binvox/) –

+0

जानकारी @A_A के लिए धन्यवाद, मैंने लिंक अपडेट किया है । – kolenda

संबंधित मुद्दे