• 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
Hình đại diện của người dùng
truongphu
VIP
VIP
Bài viết: 4756
Ngày tham gia: CN 04/11/2007 10:57 am
Đến từ: Cam Đức, Khánh hòa
Has thanked: 14 time
Been thanked: 509 time

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

Gửi bàigửi bởi truongphu » T.Sáu 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
Tập tin đính kèm
3D.zip
(7.53 KiB) Đã tải 1454 lần


o0o--truongphu--o0o

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

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

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

Gửi bàigửi bởi hdn » T.Ba 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.
:|

Hình đại diện của người dùng
playgemboy
Thành viên danh dự
Thành viên danh dự
Bài viết: 289
Ngày tham gia: CN 13/04/2008 6:10 am
Đến từ: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi playgemboy » CN 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>

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

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

Gửi bàigửi bởi hdn » T.Hai 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) Đã xem 5575 lần

Gia3D.rar
(7.22 KiB) Đã tải 628 lần
Sửa lần cuối bởi hdn vào ngày T.Hai 14/04/2008 6:51 pm với 1 lần sửa.
:|

Hình đại diện của người dùng
hdn
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 319
Ngày tham gia: T.Tư 26/03/2008 7:09 pm
Has thanked: 1 time
Been thanked: 4 time

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

Gửi bàigửi bởi hdn » T.Hai 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:

Mã: Chọn hết

  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:

Mã: Chọn hết

  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ẽ.
:|

Hình đại diện của người dùng
playgemboy
Thành viên danh dự
Thành viên danh dự
Bài viết: 289
Ngày tham gia: CN 13/04/2008 6:10 am
Đến từ: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi playgemboy » T.Hai 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) Đã tải 470 lần

hoangluyen đã viết: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>

Hình đại diện của người dùng
playgemboy
Thành viên danh dự
Thành viên danh dự
Bài viết: 289
Ngày tham gia: CN 13/04/2008 6:10 am
Đến từ: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi playgemboy » T.Năm 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) Đã tải 509 lần
<I Come Back>

Hình đại diện của người dùng
anhtuyenbk
Guru
Guru
Bài viết: 1311
Ngày tham gia: T.Năm 22/09/2005 4:12 pm
Đến từ: Một nơi chừa từng biết, chưa từng nghe, chưa từng thấy
Been thanked: 38 time

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

Gửi bàigửi bởi anhtuyenbk » T.Sáu 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 :)) :))

Mã: Chọn hết

  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
Bài viết: 20
Ngày tham gia: T.Năm 18/08/2005 10:16 am
Đến từ: sao hoa~
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi akth8283 » T.Bảy 08/11/2008 4:15 pm

học 3D thi` vao` dây nè..... xem hình (old caulacbovb)
Tập tin đính kèm
jh.JPG
nak

Hình đại diện của người dùng
playgemboy
Thành viên danh dự
Thành viên danh dự
Bài viết: 289
Ngày tham gia: CN 13/04/2008 6:10 am
Đến từ: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi playgemboy » T.Bảy 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
Bài viết: 40
Ngày tham gia: T.Tư 14/04/2010 11:34 pm
Đến từ: (Phố cổ) Hội An - Quảng Nam
Liên hệ:

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

Gửi bàigửi bởi solverpvd » T.Ba 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

Hình đại diện của người dùng
playgemboy
Thành viên danh dự
Thành viên danh dự
Bài viết: 289
Ngày tham gia: CN 13/04/2008 6:10 am
Đến từ: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Liên hệ:

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

Gửi bàigửi bởi playgemboy » T.Năm 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>


Quay về “[VB] Mã nguồn linh tinh”

Đang trực tuyến

Đang xem chuyên mục này: Yahoo [Bot]1 khách