2016-05-03 29 views
5

में एक आरजीएल व्यूपॉइंट की प्रतिलिपि बनाना rgl का उपयोग करके एक सभ्य दृष्टिकोण का चयन करना सुविधाजनक होगा और फिर उसी पैरामीटर को lattice 3 डी-प्लॉट में अपनाने के लिए सुविधाजनक होगा। उदाहरण के लिए, एक गैर-सूचनात्मक दृष्टिकोण का उपयोग करके निम्नलिखित साजिश दी गई।जाली

library(lattice) 
wireframe(volcano, screen = list(x=0, y=0, z=0)) 

enter image description here

ही rgl में खोला जा सकता द्वारा

library(rgl) 
persp3d(volcano) 
view3d(0, 0) 

enter image description here

सहभागितापूर्ण तरीके से यह एक जानकारीपूर्ण देखने के लिए भूखंड बारी बारी से करने के लिए आसान है।

enter image description here

मैट्रिक्स इसी x, y, zscreen मापदंडों जाली में देखने को दोहराने के लिए में में से

p <- par3d() 
p$userMatrix 

कैसे इस मैट्रिक्स परिवर्तित किया जा सकता निकाला जा सकता है वर्तमान rgl दृष्टिकोण दे रही है ?

अद्यतन 1

मैं नीचे 42 के रूपांतरण बाहर की कोशिश की। कोड प्रति पंक्ति आरजीएल साजिश और संबंधित जाली साजिश दिखाता है। अगर मैंने इसे सही तरीके से कार्यान्वित किया है (नीचे कोड देखें), फिर भी एक मुद्दा प्रतीत होता है।

enter image description here

# convert rgl viewpoint into lattice 
# screen orientation 
rgl_to_lattice_viewpoint <- function() 
{ 
    p <- par3d() 
    rotm <- p$userMatrix 
    B = 360*atan(rotm[1,2]/rotm[2,2])/(2*pi) 
    P = 360*asin(-rotm[3,2])/(2*pi) 
    H = 360*atan(rotm[3,1]/rotm[3,3])/(2*pi) 
    list(x=-B, y=-P, z=-H) 
} 


# read and plot PNG image 
plot_png <- function(f) 
{ 
    img <- readPNG(f) 
    rimg <- as.raster(img)  # raster multilayer object 
    plot(NULL, xlim=c(0,1), ylim=c(0,1), xlab = "", ylab = "", 
     asp=1, frame=F, xaxt="n", yaxt="n") 
    rasterImage(rimg, 0, 0, 1, 1) 
} 


# create rgl snapshot with random rotation and 
# corresponding lattice wireframe plot 
lattice_plus_rgl_plot <- function() 
{ 
    # rgl plot random rotation 
    persp3d(volcano, col = "green3") 
    theta <- sample(-180:180, 1) 
    phi <- sample(-90:90, 1) 
    view3d(theta, phi, fov=40) 
    v <- rgl_to_lattice_viewpoint() 
    f <- tempfile(fileext = ".png") 
    rgl.snapshot(f) 
    rgl.close() 

    # lattice plot 
    f2 <- tempfile(fileext = ".png") 
    png(f2) 
    print(wireframe(volcano, screen = v)) 
    dev.off() 

    # plot both 
    plot_png(f) 
    plot_png(f2) 
} 

# CREATE SOME PLOTS 

library(rgl) 
library(lattice) 
library(png) 
par(mfrow=c(3,2), mar=c(0,0,0,0)) 
replicate(3, lattice_plus_rgl_plot()) 

उत्तर

1

मैं इस सवाल का जवाब इस सवाल का रूपांतरण के लिए एक रोटेशन मैट्रिक्स से कोण के लिए इस्तेमाल किया: Conversion euler to matrix and matrix to euler। मैं चिंता करने के लिए स्वीकार करता हूं कि मैं यहां कुछ और अलग जवाब देखता हूं: How to calculate the angle from Roational matrix। (मेरे रेखीय बीजगणित काफी अच्छा निर्धारित करने के लिए इनमें से सही नहीं है।)

p <- par3d() 
rotm <- p$userMatrix 
B = 360*atan(rotm[1,2]/rotm[2,2])/(2*pi) 
P = 360*asin(-rotm[3,2])/(2*pi) 
H = 360*atan(rotm[3,1]/rotm[3,3])/(2*pi) 

> print(list(B,P,H)) 
[[1]] 
[1] 41.54071 

[[2]] 
[1] 40.28412 

[[3]] 
[1] 41.24902 

उस बिंदु पर मैं पहले से ही मोटे तौर पर "को देखने के बिंदु" है कि आप का सुझाव दिया था करने के लिए RGL-वस्तु घुमाया था। मैंने प्रयोग द्वारा खोजा कि वायरफ्रेम कॉल को दिए गए नकारात्मक मूल्यों ने जाहिर तौर पर सही परिणाम दिए हैं। "दर्शक रोटेशन कोण" को "ऑब्जेक्ट रोटेशन कोण" के लिए नकारात्मक के रूप में देखा जाता है।

png(); print(wireframe(volcano, screen = list(x=-B, y=-P, z=-H))); dev.off() 

enter image description here

वहाँ TeachingDemos पैकेज में एक rotate.wireframe समारोह है, लेकिन यह समवर्ती चलती RGL भूखंडों के साथ अच्छी तरह से नहीं चलता है। (जब तक मैंने आरजीएल डिवाइस बंद नहीं किया तब तक कोई साजिश स्पष्ट नहीं थी।) मैक पर चलते समय भी यह छोटी तरह लग रहा था (जाली साजिश में मोटी काली रेखा)। यह टीके/टीसीएल कार्यों के माध्यम से बातचीत का प्रबंधन करने के लिए एक्स 11/एक्सक्वर्ट्ज सुविधाओं का उपयोग करता है और मैं प्रदर्शित कोणों से भूखंडों को पुन: उत्पन्न करने में असमर्थ था। कोड को देखकर मैं समझ नहीं पा रहा हूं कि ऐसा क्यों होना चाहिए। लेकिन आपका माइलेज भिन्न हो सकता है।

+0

धन्यवाद! :) मैंने अपनी पोस्ट (अद्यतन 1) संपादित की जहां मैंने आपके द्वारा सुझाए गए रूपांतरण की कोशिश की। ऐसा लगता है कि मैंने कोई गलती नहीं की है। –

1

अपने कार्य के इस संस्करण में orientlib पैकेज से रूपांतरण का उपयोग करता है, और रोटेशन मैट्रिक्स एक तर्क बनाता है:

rgl_to_lattice_viewpoint <- function(rotm = par3d("userMatrix")) 
{ 
    e <- -orientlib::eulerzyx(orientlib::rotmatrix(rotm[1:3, 1:3]))@x*180/pi 
    list(z = e[1], y = e[2], x = e[3]) 
} 

ध्यान दें कि z, y एक्स क्रम आवश्यक है। rgl and lattice plots

ये रोटेशन सही:

अपने कार्य के स्थान पर इसका इस्तेमाल करते हुए, मैं इस उत्पादन मिलता है। मुझे नहीं पता कि परिप्रेक्ष्य से मिलान करना भी संभव है या नहीं।

जोड़ने के लिए संपादित: rgl संस्करण 0.95.1468, अभी तक केवल आर-फोर्ज, पर उपलब्ध इस फ़ंक्शन का एक संस्करण और बेस ग्राफिक्स के लिए भी एक है।

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