• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

[VB6] Bài học về 3D: Drawing a 3D Object

Các ví dụ nho nhỏ và những thứ linh tinh không thuộc nhóm nào
User avatar
truongphu
VIP
VIP
Posts: 4766
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 520 times

[VB6] Bài học về 3D: Drawing a 3D Object

Postby truongphu » Fri 04/04/2008 6:09 am

Tên chương trình: Drawing a 3D Object
Ngôn ngữ lập trình: VB6
Tác giả: ttalma@stny.rr.com
Planet-Source-Code.com">By: Tim Talma
ttalma@stny.rr.com
Planet-Source-Code.com
Chức năng: Vẽ một hình 3D chuyển động


Code dễ hiểu
Attachments
3D.zip
(7.53 KiB) Downloaded 1548 times


o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 319
Joined: Wed 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 times

Re: Bài học về 3D: Drawing a 3D Object

Postby hdn » Tue 08/04/2008 12:06 pm

:|
Cái code của bác truongphu up lên là hình 2D thôi, vẽ các đường thẳng, nhưng theo sự tính toán để tạo hình ảnh giả-3D phù hợp với từng góc nhìn. Cái đó ko phải 3D.
:|

User avatar
playgemboy
Thành viên danh dự
Thành viên danh dự
Posts: 289
Joined: Sun 13/04/2008 6:10 am
Location: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Contact:

Re: Bài học về 3D: Drawing a 3D Object

Postby playgemboy » Sun 13/04/2008 3:01 pm

đúng là ko phải 3D của DirectX nhưng lại khá hay cho nhưng ai mù tịt DX.
Em Cũng đã nghiên cưu cái giả 3D này từ lâu lắm rồi nhưng không ra.
Mã nguôn về mấy cái hình 3D này cũng rất nhiều nhưng vẫn chưa tìm ra được cái căn bản của nó.Có ai biết thì chỉ em với.Em định Viết chương trình vẽ hình không gian(bằng mấy cái line thôi), để khi học hình học(em học lớp 11) vẽ vô máy mà xoay tới xoay lui nhìn cho ra chứ vẽ trên giấy nhìn ko ra được.
Em ví dụ như vầy nhé:
Em có 3 điểm A,B,C có toạ độ X,Y,Z cho trước, làm sao vẽ được một tứ diện từ 3 điểm này (em chưa mơ tới chuyện xoay nó).
Em chỉ vẽ được các điểm riêng lẻ trên 3 hệ trục Y-O-X, Y-O-Z, Z-O-X (giống như là hình chiếu của tứ diện nhìn từ 3 phía ấy mà)
Còn cái hình 3D thì em nhờ mấy bác vậy.
<I Come Back>

User avatar
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 319
Joined: Wed 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 times

Re: Bài học về 3D: Drawing a 3D Object

Postby hdn » Mon 14/04/2008 2:14 pm

Đây là ví dụ do mình làm, tham khảo từ mấy cái source trên pscode, dùng cái này có thể vẽ đường thẳng trong hệ trục tọa độ 3D, mở rộng ra, ví dụ muốn vẽ một mặt phẳng trong hệ trục 3D thì ta chỉ cần vẽ 4 đường thẳng trong trục 3D, trên cơ sở đó ta có thể vẽ các khối hình không gian khác.
gia3D.png
gia3D.png (7.72 KiB) Viewed 9115 times

Gia3D.rar
(7.22 KiB) Downloaded 745 times
Last edited by hdn on Mon 14/04/2008 6:51 pm, edited 1 time in total.
:|

User avatar
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 319
Joined: Wed 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 times

Re: Bài học về 3D: Drawing a 3D Object

Postby hdn » Mon 14/04/2008 6:50 pm

Giải thích code 1 tí:
Đầu tiên, có các khái niệm sau:
-Vector3D: Nếu ai đã học cấp 3 thì sẽ biết khái niệm véc-tơ (vector), Vector3D ở đây là một cái vector bình thường nhưng nằm trong hệ trục tọa độ Oxyz (3 chiều), một vector 3d có dạng: u(x,y,z)
-Vector2D: là cái vector trong hệ trục Oxy (2 chiều), một vector2d có dạng: v(x,y)
-TRANSFORMED3d: đây thực chất là một bản sao của đối tượng được khai báo kiểu Vector3d, nó không có giá trị nào về mặt toán học (ta ko dùng nó để tính toán). Mặc định, hệ trục tọa độ của VB6 là điểm gốc tọa độ (0,0) nó nằm ở góc trên-trái của khung nhìn, Trans3D có nhiệm vụ là đưa các tọa độ tương ứng về lại hệ trục tọa độ với gốc tọa độ nằm ngay chính giữa khung nhìn.
-Line2D: là một đường thẳng trong hệ trục 2D bình thường.
-Điểm nhìn (Viewpoint): là điểm mà tại đó, ta đặt "mắt" để nhìn xung quanh.
-OUTBOX: là đối tượng picturebox mà ta dùng để vẽ lên đó (khung nhìn).
-Số ô lưới: một khung nhìn là một bảng gồm NxN ô, số ô lưới chính là giá trị N. Như hình trên kia thì OUTBOX (khung nhìn) được khởi tạo với số ô lưới là 16 (trên kia là một bảng 16x16 ô).
Hàm VecTrans3D:

Code: Select all

  1.  
  2. Public Sub VecTrans3D(Vector As VECTOR3D)
  3.     Dim TwipsPerQuad As Long
  4.  
  5.     TwipsPerQuad = OUTBOX.ScaleWidth / SoOLuoi
  6.    
  7.     Vector.ChuyenGocToaDo.x1 = (OUTBOX.ScaleWidth / 2) + Vector.x1 * TwipsPerQuad
  8.     Vector.ChuyenGocToaDo.x2 = (OUTBOX.ScaleHeight / 2) - Vector.x2 * TwipsPerQuad            'Achse umdrehen
  9.     Vector.ChuyenGocToaDo.x3 = Vector.x3 * TwipsPerQuad
  10.          
  11. End Sub
  12.  

Hàm này dùng để chuyển gốc tọa độ từ góc trên-trái về điểm chính giữa khung nhìn.
Hàm vẽ đường thẳng trong môi trường 3D:

Code: Select all

  1.  
  2. Public Sub Ve_Duong_Thang(p1 As VECTOR3D, p2 As VECTOR3D, Color As Long)
  3.     Dim L As LINE2D
  4.     Dim Skalar As Double
  5.     VecTrans3D p1
  6.     VecTrans3D p2
  7.     TwipsPerQuad = OUTBOX.ScaleWidth / SoOLuoi
  8.     Skalar = -TwipsPerQuad / (p1.ChuyenGocToaDo.x3 - Diem_Nhin.ChuyenGocToaDo.x3)
  9.     L.x1 = (Diem_Nhin.ChuyenGocToaDo.x1 + Skalar * (p1.ChuyenGocToaDo.x1 - Diem_Nhin.ChuyenGocToaDo.x1))
  10.     L.x2 = (Diem_Nhin.ChuyenGocToaDo.x2 + Skalar * (p1.ChuyenGocToaDo.x2 - Diem_Nhin.ChuyenGocToaDo.x2))
  11.     Skalar = -TwipsPerQuad / (p2.ChuyenGocToaDo.x3 - Diem_Nhin.ChuyenGocToaDo.x3)
  12.     L.y1 = (Diem_Nhin.ChuyenGocToaDo.x1 + Skalar * (p2.ChuyenGocToaDo.x1 - Diem_Nhin.ChuyenGocToaDo.x1))
  13.     L.y2 = (Diem_Nhin.ChuyenGocToaDo.x2 + Skalar * (p2.ChuyenGocToaDo.x2 - Diem_Nhin.ChuyenGocToaDo.x2))
  14.     OUTBOX.Line (L.x1, L.x2)-(L.y1, L.y2), Color
  15. End Sub
  16.  

Vẽ một đường thẳng trong môi trường 3D với các tham số là: Điểm đầu, điểm cuối (là các vector3D) và màu sắc của đường thẳng được vẽ.
:|

User avatar
playgemboy
Thành viên danh dự
Thành viên danh dự
Posts: 289
Joined: Sun 13/04/2008 6:10 am
Location: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Contact:

Re: Bài học về 3D: Drawing a 3D Object

Postby playgemboy » Mon 05/05/2008 8:20 pm

:D , mới thi HK xong, tạm ổn. Học kì 2 học về Hình ko gian nhưng chả đề cập gì đến tọa độ cả (hình như qua 12 mới đụng tới). Ngồi nghiên cứu cái code của HDN phức tạp quá, lên PS mới kiếm được cái code chuyển 2D dễ hiểu hơn nhiều.
3d tu tui.rar
(10.26 KiB) Downloaded 556 times

hoangluyen wrote:Chào bạn!
Cái đồ họa 3D mình ko hiểu rõ lắm bạn có thể chỉ rõ rùm mình được không? Nhất là sử dụng các biến để tùy biến tọa độ...
Mình thấy cái này rất hay, nếu phát triển nên thì rẩt tốt. Mình đang muốn học đây mà khó quá!
Hê hê!!!!!
Bạn chỉ giúp mình nhé!

Mình nghĩ cái này có thể giúp bạn, đang nghiên cứu để quản lý điểm và đường thằng qua biến mảng(hơi khó đang làm dở).Còn nhiều vấn đề khác nữa như tính toán sao cho người dùng thao tác được trên hình luôn (mới chỉ làm được chọn điểm và chọn đường thẳng, vẽ line trực tiếp). bác nào giỏi giúp em tối ưu hóa cái code cái, còn rắc rối lắm.
hdn giỏi, giúp mình mấy thứ này được ko:
-Vd mình đang move chuột lên một đường thẳng (trên hình 2d) có thể suy ra tọa độ 3D của nó ko (mình nghĩ là được vì căn cứ vào tọa độ 3D của 2 điểm mút, chia tỉ lệ ra có thế suy ra, nhưng mình ko giỏi lắm cho nên :D ,)
-Cho 2 điểm (tọa độ 2D) làm sao biết con chuột (X,Y) đang di chuyển trên đoạn thẳng nối 2 điểm này? (mình dùng 2 pp:
1. vector(AB) = k.vector(AO) O là điểm cần kiểm tra, nếu True thì đang nằm trên AB, tuy nhiên cách này hơi rắc rối phải chặn thêm nhiều Điều kiện nữa, trong code có hàm IsMid là thằng này đó.
2. xài theo pp độ dài, AO+OB = AB, cách này đơn giản hơn một chút, có tọa độ, ta sẽ tính được độ dài, nếu cộng lại gần bằng(do sai số) thì True, trong code là hàm IsMid2.)
Còn cách nào nữa ko?
3. Biết tọa độ(3D) 3 điểm A,B,C. Tìm tọa độ điểm D trên AB sao cho CD vuông góc AB (giả sử điểm ABC là tam giác nhọn). Theo mình, cái này chắc cũng đụng đến Vector, nếu ở 2D thì mình có thể tự nghiên cứu nhưng đằng này nó lại ở 3D(có lẽ các khái niệm trên 2D không áp dụng được-trừ cái tọa độ trung điểm của AB thì mới có thể lấy trung bình cộng). Hdn giúp mình nha!!, còn khá nhiều vấn đề phát sinh lắm. Viết phần mềm này sang năm học hình học đỡ cực hơn :D
<I Come Back>

User avatar
playgemboy
Thành viên danh dự
Thành viên danh dự
Posts: 289
Joined: Sun 13/04/2008 6:10 am
Location: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Contact:

Re: Bài học về 3D: Drawing a 3D Object

Postby playgemboy » Thu 15/05/2008 9:49 pm

Khẹc, ý em nói là giải quyết hộ em mấy bài toán rắc rối trên kia kìa, chứ mấy cái Xoay, Thêm-Xóa điểm, đường thẳng, thao tác trên hình thì em đang làm (cũng gần xong rồi). Xem thử cái Code em mới cải tiến, cũng khá Cool (có gì góp ý nha:D)
Hinh Hoc Demo.rar
Chương trình vẽ hình không gian đang viết dở....
(7.63 KiB) Downloaded 603 times
<I Come Back>

User avatar
anhtuyenbk
Guru
Guru
Posts: 1311
Joined: Thu 22/09/2005 4:12 pm
Location: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 times

Re: Bài học về 3D: Drawing a 3D Object

Postby anhtuyenbk » Fri 16/05/2008 9:22 pm

Hic, mất toi hết 30 phút ngồi viết tay mấy công thức và đánh máy, mệt quá :( :( . Sau lần này ko viết code VB6 nữa :)) :))

Code: Select all

  1. Option Explicit
  2. 'He so duong thang
  3.  Public Type HesoLine
  4.      A As Single
  5.      B As Single
  6.      C As Single
  7.  End Type
  8. 'Nghiem cua phuong trinh
  9. Public Type NghiemPT
  10.      X1 As Single
  11.      X2 As Single
  12.  End Type
  13.  'Tao do diem
  14.  Public Type Toado
  15.      X As Single
  16.      Y As Single
  17.  End Type
  18.  
  19.  Public Function FindHesoLine(X1 As Single, Y1 As Single, X2 As Single, Y2 As Single) As HesoLine
  20.      Dim ketqua As HesoLine
  21.      ketqua.A = Y2 - Y1
  22.      ketqua.B = X1 - X2
  23.      ketqua.C = X2 * Y1 - X1 * Y2
  24.      FindHesoLine = ketqua
  25.  End Function
  26.  
  27. Public Function GiaiPTBac2(A As Single, B As Single, C As Single) As NghiemPT
  28.     Dim delta As Single, Nghiem As NghiemPT
  29.     delta = B * B - 4 * A * C
  30.     Nghiem.X1 = (-B - Sqr(delta)) / (2 * A)
  31.     Nghiem.X2 = (-B + Sqr(delta)) / (2 * A)
  32.     GiaiPTBac2 = Nghiem
  33. End Function
  34. Public Function FindToadoTuKhoangcach(X1 As Single, Y1 As Single, X2 As Single, Y2 As Single, Khoangcach As Single) As Toado
  35.     'Tìm he so duong thang AB
  36.     Dim HesoLineAB As HesoLine
  37.     HesoLineAB = FindHesoLine(X1, Y1, X2, Y2)
  38.     'He so chuyen doi
  39.     Dim HesoConvert As HesoLine
  40.     HesoConvert.A = -HesoLineAB.A / HesoLineAB.B
  41.     HesoConvert.B = -HesoLineAB.C / HesoLineAB.B
  42.     HesoConvert.C = HesoConvert.B - Y1
  43.     'He so phuong trinh bac 2
  44.     Dim HesoPTBac2 As HesoLine
  45.     HesoPTBac2.A = 1 + HesoConvert.A * HesoConvert.A
  46.     HesoPTBac2.B = 2 * (HesoConvert.A * HesoConvert.C - X1)
  47.     HesoPTBac2.C = HesoConvert.C * HesoConvert.C - Khoangcach * Khoangcach + X1 * X1
  48.     'Giao diem cua duong thang voi duong tron
  49.     Dim Giaodiem As NghiemPT, ToadoM As Toado
  50.     Giaodiem = GiaiPTBac2(HesoPTBac2.A, HesoPTBac2.B, HesoPTBac2.C)
  51.     If Giaodiem.X1 > X1 And Giaodiem.X1 < X2 Then
  52.         ToadoM.X = Giaodiem.X1
  53.     Else
  54.         ToadoM.X = Giaodiem.X2
  55.     End If
  56.     'Tim y
  57.         ToadoM.Y = HesoConvert.A * ToadoM.X + HesoConvert.B
  58.     'Ket qua
  59.     FindToadoTuKhoangcach = ToadoM
  60. End Function
  61.  
Kiếm cơm cho qua ngày tháng
https://www.facebook.com/pinduphongpisenchinhhang

akth8283
Thành viên chính thức
Thành viên chính thức
Posts: 20
Joined: Thu 18/08/2005 10:16 am
Location: sao hoa~
Been thanked: 1 time
Contact:

Re: [VB6] Bài học về 3D: Drawing a 3D Object

Postby akth8283 » Sat 08/11/2008 4:15 pm

học 3D thi` vao` dây nè..... xem hình (old caulacbovb)
Attachments
jh.JPG
nak

User avatar
playgemboy
Thành viên danh dự
Thành viên danh dự
Posts: 289
Joined: Sun 13/04/2008 6:10 am
Location: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Contact:

Re: [VB6] Bài học về 3D: Drawing a 3D Object

Postby playgemboy » Sat 08/11/2008 10:00 pm

Hic, sao hổng send link luôn cho rồi, nhìn hình xong phải ngồi kiếm.
http://quantoancity.com/caulacbovb/foru ... 44&p=81478
Uhm, chủ đề này cũng rất sôi nổi, để em "ngâm" cứu tiếp.
<I Come Back>

solverpvd
Thành viên chính thức
Thành viên chính thức
Posts: 40
Joined: Wed 14/04/2010 11:34 pm
Location: (Phố cổ) Hội An - Quảng Nam
Contact:

Re: [VB6] Bài học về 3D: Drawing a 3D Object

Postby solverpvd » Tue 11/06/2013 10:01 am

gửi playgemboy
giúp mình cminh ra công thức này với:
vX = -v3d.X * Sin_Theta - v3d.Z * Cos_Theta
vY = -v3d.X * Cos_Theta * Cos_Phi + v3d.Z * Sin_Theta * Cos_Phi + v3d.Y * Sin_Phi
vZ = -v3d.X * Cos_Theta * Sin_Phi + v3d.Z * Sin_Theta * Sin_Phi - v3d.Y * Cos_Phi + 10

thank playgemboy,
PVD

User avatar
playgemboy
Thành viên danh dự
Thành viên danh dự
Posts: 289
Joined: Sun 13/04/2008 6:10 am
Location: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Contact:

Re: [VB6] Bài học về 3D: Drawing a 3D Object

Postby playgemboy » Thu 13/06/2013 9:07 pm

Chịu. Phương pháp biến đổi mình ko biết cách chứng minh, chỉ biết áp dụng thôi.
<I Come Back>


Return to “[VB] Mã nguồn linh tinh”

Who is online

Users browsing this forum: No registered users and 0 guests