2016-08-05 9 views
9

घुमाएं मैं मायावी की triangular_mesh विधि का उपयोग कर 3 डी जाल की योजना बना रहा हूं। डेटा 3 डी स्पेस में फेस-डाउन डालने वाले मानव सिल्हूट का वर्णन करता है (इसलिए cmap कैमरे से दूरी को इंगित करने के लिए उपयोग किया जा सकता है)।मायावी: वाई अक्ष

यहाँ साजिश (चेहरे और कोने एक बाहरी वस्तु से आते हैं, और अब तक भी कई यहाँ दिखाने के लिए देखते हैं) उत्पन्न करने के लिए इस्तेमाल किया कोड है: कैमरा चलती बिना

from mayavi import mlab 

import math 
import numpy as np 
import sys 
import os 


fig = mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1), size=(1920, 980)) 

a = np.array(this_mesh.vertices - refC.conj().transpose()) # this_mesh is an object created from external data files 

this_mesh.faces = this_mesh.faces.astype(int) -1 # mesh data is generated by matlab, which is 1-indexed 

m = mlab.triangular_mesh(x, y, z, this_mesh.faces, opacity=0.75) 

mlab.axes(extent=[-1100, 1100, -1100, 1100, -1100, 1100]) 

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

mlab.view(azimuth=0, elevation=180) 
mlab.show() 

मेरा अगला कार्य छवियों जहां भूखंड के आसपास कैमरा पैन, सिल्हूट सही करने के लिए का सामना करना पड़ के साथ शुरू, और यह बाईं ओर का सामना करना पड़ के साथ परिष्करण की एक श्रृंखला बनाने के लिए है।

जटिलता यह है कि गहराई की जानकारी के लिए रंगमंच प्राप्त करने के लिए, मैं पहले से ही दृश्य के अजीमुथ और ऊंचाई (जैसा ऊपर दिए गए कोड में दिखाया गया है) को आगे बढ़ा रहा हूं। मायावी में matplotlib की तुलना में कैमरे को स्थानांतरित करने के लिए अधिक विकल्प हैं, लेकिन ऐसा लगता है कि वाई अक्ष के चारों ओर घूमने का कोई तरीका नहीं है, इसलिए मुझे लगता है कि मुझे एजीमुथ और ऊंचाई पर कुछ जटिल गणना करने की आवश्यकता होगी एक ही परिणाम - लेकिन मुझे कहां से शुरू करना है, मैं हार गया हूं (मैं 3 डी स्पेस में काम करने के लिए नया हूं, और मेरा दिमाग अभी तक ऐसा नहीं सोचता है)।

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

उत्तर

1

यह पता चला है कि इस के लिए एक समाधान का एक सा है।

आप कलाकारों को स्वतंत्र रूप से कैमरे से अपने अक्षों पर घुमा सकते हैं। (यह डेटा लेबलिंग के साथ कदम से बाहर दृश्य फेंकता है, लेकिन जैसा कि मैंने वास्तव में व्यक्ति की कुल्हाड़ियों छुपा कर रहा हूँ यह इस मामले में कोई फर्क नहीं पड़ता।)

तुम सब करने की ज़रूरत है:

m.actor.actor.rotate_y(desired_angle) 

... और आप जाने के लिए अच्छे हैं।

2

आपको यहां कुछ गणित की आवश्यकता है। ठीक है, कोड के संदर्भ में इसे कैसे किया जाए, यह सबसे अच्छा कोड नहीं है लेकिन मैं इसे स्वयं व्याख्यात्मक बनाना चाहता हूं। मैं इसे प्राप्त करने के लिए 3 डी में रोटेशन के लिए रॉड्रिग्स फॉर्मूला का उपयोग करता हूं, az_new और el_new आपके नए देखने वाले कोण हैं। थीटा का मान परिवर्तित संदर्भ की सीमा में एक अलग देखने के कोण पाने के लिए, मैं नीचे दिए गए कोड में 45 डिग्री का इस्तेमाल किया है:

import numpy as np 
import math 

def rotation_matrix(axis, theta): 
    """ 
    Return the rotation matrix associated with counterclockwise rotation about 
    the given axis by theta radians. 
    """ 
    axis = np.asarray(axis) 
    theta = np.asarray(theta) 
    axis = axis/math.sqrt(np.dot(axis, axis)) 
    a = math.cos(theta/2.0) 
    b, c, d = -axis*math.sin(theta/2.0) 
    aa, bb, cc, dd = a*a, b*b, c*c, d*d 
    bc, ad, ac, ab, bd, cd = b*c, a*d, a*c, a*b, b*d, c*d 
    return np.array([[aa+bb-cc-dd, 2*(bc+ad), 2*(bd-ac)], 
        [2*(bc-ad), aa+cc-bb-dd, 2*(cd+ab)], 
        [2*(bd+ac), 2*(cd-ab), aa+dd-bb-cc]]) 


az = 90 
el = -75 

x = np.cos(np.deg2rad(el))*np.cos(np.deg2rad(az)) 
y = np.cos(np.deg2rad(el))*np.sin(np.deg2rad(az)) 
z = np.sin(np.deg2rad(el)) 

# So your viewing vector in x,y coordinates on unit sphere 
v = [x,y,z] 

# Since you want to rotate about the y axis from this viewing angle, we just increase the 
# elevation angle by 90 degrees to obtain our axis of rotation 

az2 = az 
el2 = el+90 

x = np.cos(np.deg2rad(el2))*np.cos(np.deg2rad(az2)) 
y = np.cos(np.deg2rad(el2))*np.sin(np.deg2rad(az2)) 
z = np.sin(np.deg2rad(el2)) 

axis = [x,y,z] 

# Now to rotate about the y axis from this viewing angle we use the rodrigues formula 
# We compute our new viewing vector, lets say we rotate by 45 degrees 
theta = 45 
newv = np.dot(rotation_matrix(axis,np.deg2rad(theta)), v) 

#Get azimuth and elevation for new viewing vector 
az_new = np.rad2deg(np.arctan(newv[1]/newv[0])) 
el_new = np.rad2deg(np.arcsin(newv[2])) 
+0

बहुत बहुत धन्यवाद, यह उपयोगी लगता है। यह सोमवार को यह देखने के लिए कोशिश करेगा कि यह कैसे काम करता है। – MassivePenguin

+0

हम्म, काफी नहीं है (यह गलत अक्ष पर घूर्णन कर रहा है)। मुझे एक पूरी तरह से अलग दृष्टिकोण की कोशिश करनी पड़ सकती है ... – MassivePenguin

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