2012-11-09 42 views
5

Tôi tìm thấy một tấn công thức và những gì không, nhưng 3D không phải là sở trường của tôi vì vậy tôi đang mất đi những gì cụ thể để sử dụng. Mục tiêu của tôi là chuyển đổi dữ liệu trong tệp .obj 3D (đỉnh, tiêu chuẩn, khuôn mặt) thành CSS3D (chiều rộng, chiều cao, xoayX, Y, Z và/hoặc biến đổi tương tự).Chuyển đổi dữ liệu OBJ sang CSS3D

Ví dụ 2 máy bay đơn giản

g plane1 
# simple along along Z axis 
v 0.0 0.0 0.0 
v 0.0 0.0 1.0 
v 0.0 1.0 1.0 
v 0.0 1.0 0.0 

g plane2 
# plane rotated 90 degrees along Y-axis 
v 0.0 0.0 0.0 
v 0.0 1.0 0.0 
v 1.0 1.0 0.0 
v 1.0 0.0 0.0 

f 1 2 3 4 
f 5 6 7 8 

dữ liệu này có thể được chuyển đổi sang:

#plane1 { 
    width: X; 
    height: Y; 
    transform: rotateX(Xdeg) rotateY(Ydeg) rotateZ(Zdeg) translateZ(Zpx) 
} 

#plane2 { 
    width: X; 
    height: Y; 
    transform: rotateX(Xdeg) rotateY(Ydeg) rotateZ(Zdeg) translateZ(Zpx) 
} 

/* Or something equivalent such as transform: matrix3d() */ 

Câu hỏi cốt lõi là làm thế nào để có được X/Y/Z-quay của một chiếc máy bay 4 điểm từ ma trận của x, y, z tọa độ?

CẬP NHẬT # 1 - 11/12/12 Vì vậy, dựa trên các câu trả lời cung cấp, tôi đã đi qua các chức năng được tối ưu hóa từ http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToEuler/index.htm dưới đây:

/* 
    -v 0.940148 -0.847439 -1.052535 
    -v 0.940148 -0.847439 0.947465 
    -v -1.059852 -0.847439 0.947465 
    -v -1.059852 -0.847439 -1.052535 
    -v 0.940148 1.152561 -1.052534 
    -v 0.940147 1.152561 0.947466 
    -v -1.059852 1.152561 0.947465 
    v -1.059852 1.152561 -1.052535 

    f 1 2 3 4 
    f 5 8 7 6 
    f 1 5 6 2 
    f 2 6 7 3 
    f 3 7 8 4 
    f 5 1 4 8 
*/ 

var f = { 
    'm00' : 0.940148, 
    'm01' : -0.847439, 
    'm02' : -1.052535, 
    'm10' : 0.940148, 
    'm11' : -0.847439, 
    'm12' : 0.947465, 
    'm20' : -1.059852, 
    'm21' : -0.847439, 
    'm22' : 0.947465 
} 

// Assuming the angles are in radians. 
if (f.m10 > 0.998) { // singularity at north pole 
    heading = Math.atan2(f.m02, f.m22); 
    attitude = Math.PI/2; 
    bank = 0; 
} else if (f.m10 < -0.998) { // singularity at south pole 
    heading = Math.atan2(f.m02,f.m22); 
    attitude = -Math.PI/2; 
    bank = 0; 
} else { 
    heading = Math.atan2(-f.m20, f.m00); 
    bank = Math.atan2(-f.m12, f.m11); 
    attitude = Math.asin(f.m10); 
} 

tôi nhận được kết quả, nhưng tôi 'không chắc chắn nếu tính toán của tôi là chính xác và tôi cũng nhận được phản ứng hỗn hợp về những gì tương ứng với trục nào. Có phải là tiêu đề = y, ngân hàng = x và thái độ = z không? Tôi cũng chuyển đổi từng độ nếu điều đó quan trọng.

+1

thể trùng lặp của Matrix để Góc Euler: http://stackoverflow.com/ câu hỏi/11137591/ma trận-to-eulerangles – FlavorScape

+0

Bạn có đo lường hiệu suất không? Tạo điểm chuẩn với số lượng biến đổi css3d mong muốn dựa trên giá trị đầu vào ngẫu nhiên.Nếu nó sẽ tụt hậu trên máy đích thì công việc của bạn sẽ lãng phí thời gian. Tệp obj trung bình chứa số lượng khuôn mặt khổng lồ. – JAre

+0

Đó không phải là vấn đề về hiệu suất. Nó đi xuống để trống không chính xác toán học về phía tôi. Các tệp OBJ đang được sử dụng đang được tạo đặc biệt với CSS3D trong tâm trí để chúng sẽ có một số lượng tối đa các đa giác. –

Trả lời

7

enter image description here

đọc http://www.songho.ca/opengl/gl_matrix.html này Nó giải thích khá nhiều tất cả mọi thứ và có thực hiện. Bên cạnh đó giải pháp CSS 3D sẽ có hiệu suất thấp hơn (thứ tự độ lớn) chủ yếu là do mỗi pice của bề mặt được biểu diễn là phần tử DOM, nó cũng rất hạn chế - bạn có thể tìm thấy nhiều tài liệu về vấn đề này (ví dụ: bản ghi Google IO)

Nếu bạn cần khuôn khổ 3D declarative bạn có thể muốn nhìn vào x3dom

để vẽ một hộp 3D bạn chỉ cần bao gồm x3dom js kịch bản và nhúng tuyên bố này trong trang của bạn:

<body> 
    <h1>Hello X3DOM World</h1> 
    <x3d width="400" height="300"> 
    <scene> 
     <shape> 
     <box></box> 
     </shape> 
    </scene> 
    </x3d> 
</body> 

Nó sẽ phân tích cú pháp <x3d> thẻ trên trang của bạn và tạo việc triển khai WebGL hoặc Flash phù hợp với hiệu suất tốt.

x3d có cách nhập nội dung từ Blender, Maya và 3ds Max. Dưới đây là một số đọc tốt: x3domIntroTutorial.pdf

IE 11 sẽ hỗ trợ WebGL và IE10 sẽ tự động cập nhật lên IE 11 vì vậy chỉ không hỗ trợ trình duyệt máy tính để bàn (tắt theo mặc định) sẽ là Safari. Apple sẽ buộc phải kích hoạt nó theo mặc định. Với sự hỗ trợ đầy đủ của máy tính để bàn, sẽ không mất quá nhiều thời gian để có được thiết bị di động đầy đủ vì đó là thị trường cạnh tranh cao. Và chúng tôi có khung công tác WebGL có thể truy cập cao như three.js. Vì vậy, không có ý nghĩa trong thực hiện nó với CSS 3D

UPDATE: iOS 8 Safari sẽ cho phép hỗ trợ WebGL theo mặc định: http://caniuse.com/webgl

+1

Cảm ơn bạn đã cập nhật. Tôi thường là người chấp nhận muộn đối với các loại công nghệ này, nhưng thông tin trên là quá đủ để tôi bắt đầu một con đường hợp lý hơn. –

+0

@DonBoots 3D framework cho phép bạn thực hiện quá trình chuyển đổi này mượt mà nhất có thể. Tại thời điểm này không ai trên hành tinh này có thể biết tất cả mọi thứ về đồ họa 3d nó chỉ là quá lớn và quá sâu. Nhưng với bộ công cụ tốt, bạn có thể học những điều mới dần dần và dựa vào các hành vi mặc định của khung công tác trong một số trường hợp phức tạp. – JAre

Các vấn đề liên quan