2013-07-29 102 views
1

底部的問題更新....SketchUp實體與「翻轉(軸)」鏡像不反映在變換矩陣

我正在Ruby中編寫自定義SketchUp導出插件。然後使用導出的數據在Three.js中重新創建幾何。

我遇到了一些組件/組轉換問題,並將其跟蹤到鏡像或幾何軸上應用了「翻轉」的幾何圖形。簡而言之,翻轉並不受尊重。我無法找到任何SU Ruby方法來查明是否有任何給定的實體有此應用翻轉。

我可以得到一個變換矩陣,並將其轉換(請參見this question of mine how),但它不適用於這些翻轉的對象。這是一個示例結果;該模型的其餘部分是好的,但該艇採用翻轉船半明顯創建的,在這張照片,他們出現在所有的地方:

messy boat

我怎樣才能正確地採取這些翻轉幾何考慮?他們在SU Ruby中是否有某種單獨的矩陣或實體標誌?

注1)我觀察到內置SketchUp Collada導出器(使用Three.js ColladaLoader加載它們時)出現類似的錯誤行爲。

注2)雖然我相信這是一個SketchUp的紅寶石API的問題,我萬一有three.js所標記的這有什麼明顯我缺少的問候鏡像和矩陣..

注3)如果使用刻度工具翻轉/鏡像幾何圖形而不是沿着工具翻轉(實際上效果相同),則它們可以正常工作。

UPDATE:

仍然在努力利用這些信息,但在此基礎上的信息越來越近:http://sketchucation.com/forums/viewtopic.php?f=6&t=3083

更新#2:

感謝Thomthom,我是能夠檢測並應用正確翻轉未旋轉的物體。對於一個普通的未經旋轉/未縮放/ unflipped分量矩陣是:

1.0, 0.0, 0.0 
0.0, 1.0, 0.0 
0.0, 0.0, 1.0 

要翻轉(鏡像)成分的基體可以是:

-1.0, 0.0, 0.0 
0.0, 1.0, 0.0 
0.0, 0.0, 1.0 

因此,我可以容易地檢測到翻轉所有的罰款。

但是,如果我隨意旋轉相同的組件(unflipped)的一對夫婦軸,矩陣是這樣的:

-0.33, -0.58, 0,74 
    0.87, -0.50, 0,00 
    0.37, 0.64, 0,67 

這正常工作在我的出口商/進口商,我可以在三個重新應用此矩陣.js一面。

但是,當已經旋轉組件也反映,矩陣是這樣的:

0.33, 0.58, -0.74 
    0.87, -0.50, 0.00 
    0.37, 0.64, 0.67 

我不能three.js所正確得到這個矩陣的工作,該組件從未鏡像,導致在圖片中可以看到的行爲。

所以,我不知道該怎麼做。通過檢測更簡單的情況(僅翻轉,未旋轉或縮放),我能夠得到正確的結果,然後在Three.js中爲此類組件設置例如object.scale.x = object.scale.x * -1;。但對於項目沒有解決方案,它們都翻轉否則旋轉或縮放:(

+0

一件事? – thomthom

+0

是的,我目前正在將矩陣提供給Three.js,除了這些翻轉的組件外,它大部分都可以工作。圖片中的模型非常複雜,所有的palmtree葉子和東西,裏面的傢俱都是由具有自身轉換的組件和組的深層次結構組成的。鑑於渲染並不是完全混亂,我必須做一些正確的事情......令人困惑的是,它不適用於翻轉的東西,因爲顯然在矩陣中存在所需的數據。 – yaku

+0

考慮到內置的Three.js ColladaLoader顯示與SketchUp導出的DAE相同的問題,讓我懷疑Three.js中的Matrix4實現在涉及負面縮放時簡單混淆。或類似的東西。這真的超出了我的專業領域:) – yaku

回答

3

用我的轉型督察形象化的SketchUp矩陣4x4的方格:http://extensions.sketchup.com/en/content/transformation-inspector

使用我可以告訴這些矩陣條目改變 * **沿X翻轉:**索引#1 * **沿ÿ翻轉:**索引#5 * **向Z翻轉:**索引#10 我沿任何軸線翻轉

Martin Rinehart在SketchUp中寫下了轉換的細目:http://www.martinrinehart.com/models/tutorial/tutorial_t.html


查找與方向翻轉軸:

這讓我爲難,不能變換矩陣被送入three.js所
module TransformationHelper 

    def flipped_x? 
    dot_x, dot_y, dot_z = axes_dot_products() 
    dot_x < 0 && flipped?(dot_x, dot_y, dot_z) 
    end 

    def flipped_y? 
    dot_x, dot_y, dot_z = axes_dot_products() 
    dot_y < 0 && flipped?(dot_x, dot_y, dot_z) 
    end 

    def flipped_z? 
    dot_x, dot_y, dot_z = axes_dot_products() 
    dot_z < 0 && flipped?(dot_x, dot_y, dot_z) 
    end 

    private 

    def axes_dot_products 
    [ 
     xaxis.dot(X_AXIS), 
     yaxis.dot(Y_AXIS), 
     zaxis.dot(Z_AXIS) 
    ] 
    end 

    def flipped?(dot_x, dot_y, dot_z) 
    dot_x * dot_y * dot_z < 0 
    end 

end 


module Example 

    def self.inspect_flipped 
    tr = Sketchup.active_model.selection[0].transformation 
    tr.extend(TransformationHelper) 

    puts "X Flipped: #{tr.flipped_x?.inspect}" 
    puts "Y Flipped: #{tr.flipped_y?.inspect}" 
    puts "Z Flipped: #{tr.flipped_z?.inspect}" 
    end 

end 
+0

非常感謝!這有助於,儘管它還沒有完全發揮作用。使用你的變換檢查器,我看到,在索引0,5或10上應用-1變換將翻轉相應軸上的幾何。因此,對於基本幾何體,我可以檢查變換矩陣0,5或10是否爲負,以查看它是否在該軸上翻轉。如果組件第一次翻轉,然後任意旋轉,該檢查不再起作用。或者它可以相信一個組件僅在旋轉時纔會翻轉。 – yaku

+0

啊,是的,你說得對。發現這篇文章,概念上描述什麼人需要做:http://www.robertblum.com/articles/2005/02/14/decomposing-matrices – thomthom

+0

好吧,嘗試新的例子。 – thomthom