2011-01-23 32 views
5

Tôi đang làm việc trên một số mã JavaScript để hiển thị các phần tử 2D SVG/Canvas chuẩn (được vẽ bằng Raphael-JS) trong chế độ xem isometric 3Dish.Dịch phần tử SVG cho chế độ xem Isometric

Giả sử chúng tôi có hai hình chữ nhật được vẽ cạnh nhau. Sau đó tôi vẽ chúng ở các góc chính xác (về cơ bản là độ xoắn 30 độ) cho một góc nhìn đẳng động.

alt text

(Trong hình trên, chúng tôi đã thể hiện nguồn gốc cho hai yếu tố tương ứng.)

Vấn đề của tôi là tôi không biết làm thế nào để dịch đúng tất cả các yếu tố cá nhân để họ "xếp" chính xác thay vì chỉ chồng lên nhau.

Trong khi thực sự sử dụng gạch sẽ làm cho mọi thứ dễ dàng hơn vì tôi có thể căn cứ vào vị trí của một lát nhất định trước nó, gạch sẽ không hoạt động trong trường hợp này. Mọi thứ đều năng động và sẽ phức tạp hơn các máy bay x/y đơn giản.

Here is an image of some isometric tiles nếu có bất kỳ nhầm lẫn nào về cách tôi muốn các đối tượng này được đặt.

+0

Tiêu đề của bạn dường như chỉ ra rằng bạn đang sử dụng các phần tử HTML canvas. Kể từ khi Raphael sử dụng SVG (mặc dù họ đang nói về vải trên đó là tốt) bạn có thể muốn xóa này lên để có được một số câu trả lời. Câu hỏi thú vị, mặc dù! – polarblau

+0

Cảm ơn gợi ý, polarblau. Tôi sẽ cố làm sáng tỏ câu hỏi của mình. –

+0

Lưu ý rằng hình ảnh bạn đã cung cấp trong câu hỏi của bạn không phải là phép chiếu đẳng động chính xác, giả sử rằng hai hình vuông có cùng độ cao từ mặt đất. Như được hiển thị trong url bạn đã cung cấp, các cạnh của các ô liền kề phải được căn chỉnh sau khi chiếu. Nếu bạn đang cố gắng để hiển thị vấn đề của bạn, sau đó bạn có lẽ nên làm cho nó rõ ràng hơn rằng đây là kết quả hiện tại/sai bạn đang hiển thị. – Phrogz

Trả lời

2

Bạn không nên áp dụng phép chuyển đổi cho các phần tử riêng lẻ, nhưng đối với các phần tử nguồn dưới dạng tập hợp. Trong Raphael, bạn có thể sử dụng giống như

var s = paper.set(); 
s.push(square1, square2); 

và bây giờ làm biến đổi mà không cần quá nhiều toán học, mà là nghĩa vụ phải làm việc như thế này:

// s.clone(); // if you want to keep originals 
s.rotate(45, 0, 0).scale(1, .7).translate(100, 0); 

(Tuy nhiên, tỉ lệ các mặt hàng xoay có vẻ là bị phá vỡ trong RaphaelJS)

Plain SVG ví dụ:.

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<svg version="1.1" baseProfile="full" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" 
    viewBox="-200,-500 1000,1000"> 
    <title>Isometric</title> 
     <g id="source"> <!-- group --> 
      <circle cx="-50" cy="-50" r="50"/> 
      <rect width="100" height="100"/> 
      <rect width="100" height="100" x="101"/> 
      <rect width="100" height="100" x="50" y="-200"/> 
     </g> 
     <!-- make copy of group and apply transformations --> 
     <use xlink:href="#source" transform="translate(500) scale(1, .7) rotate(-45)"/> 
</svg> 
+0

Cảm ơn bạn đã phản hồi, Pumbaa80.Thật không may giải pháp này dường như không phù hợp với tôi. Điều tôi muốn là cuối cùng có thể nhập một số tọa độ, ví dụ, một sơ đồ tầng cơ bản. Sau đó, render sau đó các tọa độ đó trong một phép chiếu isometric và extrude z-axis (height) từ "base" của phần tử. Sau đó, thông qua JavaScript, tôi muốn có thể thao tác các yếu tố riêng lẻ: di chuyển, xóa, thêm và thay đổi chúng. Tôi không thể thực sự, vẽ z-trục (làm cho hình khối từ dấu chân) và sau đó xoay bộ. Tôi cho rằng nó * có thể * có thể xoay mọi thứ và sau đó extrude -continued-> –

+0

<-continuted- heights bằng cách làm lại tọa độ của từng phần tử. Làm như vậy có thể làm việc nhưng có vẻ khá xấu xí có vấn đề. Sau đó, một lần nữa, có lẽ nó là đơn giản theo cách đó. Tôi se thử no. –

+0

Vì lợi ích của bất kỳ ai khác, đây là các bài đăng trên Google Groups của Raphael-JS trên quy mô của vấn đề về các yếu tố xoay: http://groups.google.com/group/raphaeljs/browse_thread/thread/217a5edb9db22419 –

3

Sử dụng 012.347.bạn có thể làm điều này bằng cách sử dụng phương thức .transform() và cung cấp một chuỗi biến đổi quay 45 độ và vảy theo chiều dọc 70% (hoặc bất kỳ độ cao nào bạn muốn). Điều quan trọng là phải chú ý đến vị trí bạn đang quay và mở rộng xung quanh - trong trường hợp này tôi đang sử dụng 0,0. Bạn cũng sẽ nhận thấy tôi dịch 100 sang bên phải để bù cho vòng quay.

Chuỗi biến đổi cũng rất tốt cho trường hợp sử dụng này vì bạn có thể chỉ cần thêm biến đổi chiếu vào việc chuyển đổi các đối tượng khác trong cảnh và tất cả sẽ kết thúc ở đúng vị trí.

Ví dụ (xem http://jsfiddle.net/k22yG/):

var paper = Raphael(10, 10, 320, 240), 
    set = paper.set(); 

// Build a set to make it easier to transform them all at once 
set.push(
    // Grid of rectangles 
    paper.rect(0, 0, 50, 50), 
    paper.rect(60, 0, 50, 50), 
    paper.rect(0, 60, 50, 50), 
    paper.rect(60, 60, 50, 50) 
); 

// Rotate, then scale, then move (describe in "reverse" order) 
set.transform('t100,0s1,0.7,0,0r45,0,0');​ 
Các vấn đề liên quan