⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 frmray.frm

📁 纯软件的光线追踪算法 可以满足你的要求
💻 FRM
字号:
VERSION 5.00
Begin VB.Form frmRay 
   BorderStyle     =   1  'Fixed Single
   Caption         =   "Ray Tracing"
   ClientHeight    =   4800
   ClientLeft      =   45
   ClientTop       =   330
   ClientWidth     =   6840
   LinkTopic       =   "Form1"
   MaxButton       =   0   'False
   MinButton       =   0   'False
   ScaleHeight     =   320
   ScaleMode       =   3  'Pixel
   ScaleWidth      =   456
   StartUpPosition =   2  'CenterScreen
   Begin VB.Frame Frame2 
      Caption         =   "P r e v i e w"
      BeginProperty Font 
         Name            =   "MS Sans Serif"
         Size            =   8.25
         Charset         =   0
         Weight          =   400
         Underline       =   0   'False
         Italic          =   0   'False
         Strikethrough   =   0   'False
      EndProperty
      Height          =   1935
      Left            =   120
      TabIndex        =   13
      Top             =   2760
      Width           =   1815
      Begin VB.PictureBox picPreview 
         AutoRedraw      =   -1  'True
         BackColor       =   &H00400000&
         Height          =   1560
         Left            =   120
         ScaleHeight     =   100
         ScaleMode       =   3  'Pixel
         ScaleWidth      =   100
         TabIndex        =   14
         Top             =   240
         Width           =   1560
      End
   End
   Begin VB.TextBox txtStep 
      Height          =   285
      Left            =   840
      TabIndex        =   3
      Text            =   "1"
      Top             =   960
      Width           =   975
   End
   Begin VB.CommandButton cmdRender 
      Caption         =   "Render"
      Height          =   375
      Left            =   480
      TabIndex        =   1
      Top             =   120
      Width           =   975
   End
   Begin VB.Frame Frame1 
      Caption         =   "Viewpoint"
      Height          =   1335
      Left            =   120
      TabIndex        =   4
      Top             =   1320
      Width           =   1815
      Begin VB.TextBox txtEyeTheta 
         Height          =   285
         Left            =   720
         TabIndex        =   7
         Text            =   "-0.3"
         Top             =   960
         Width           =   975
      End
      Begin VB.TextBox txtEyePhi 
         Height          =   285
         Left            =   720
         TabIndex        =   6
         Text            =   "-0.6"
         Top             =   600
         Width           =   975
      End
      Begin VB.TextBox txtEyeR 
         Height          =   285
         Left            =   720
         TabIndex        =   5
         Text            =   "1000"
         Top             =   240
         Width           =   975
      End
      Begin VB.Label Label4 
         Alignment       =   1  'Right Justify
         Caption         =   "Theta:"
         Height          =   255
         Left            =   120
         TabIndex        =   10
         Top             =   960
         Width           =   495
      End
      Begin VB.Label Label3 
         Alignment       =   1  'Right Justify
         Caption         =   "Phi:"
         Height          =   255
         Left            =   120
         TabIndex        =   9
         Top             =   600
         Width           =   495
      End
      Begin VB.Label Label2 
         Alignment       =   1  'Right Justify
         Caption         =   "R:"
         Height          =   255
         Left            =   120
         TabIndex        =   8
         Top             =   240
         Width           =   495
      End
   End
   Begin VB.PictureBox pic1 
      AutoRedraw      =   -1  'True
      BackColor       =   &H00400000&
      Height          =   4800
      Left            =   2040
      ScaleHeight     =   316
      ScaleMode       =   3  'Pixel
      ScaleWidth      =   316
      TabIndex        =   0
      Top             =   0
      Width           =   4800
   End
   Begin VB.Label Label7 
      Alignment       =   1  'Right Justify
      Caption         =   "Time:"
      Height          =   255
      Left            =   240
      TabIndex        =   12
      Top             =   600
      Width           =   495
   End
   Begin VB.Label lblTime 
      BorderStyle     =   1  'Fixed Single
      Caption         =   "0 sec"
      Height          =   255
      Left            =   840
      TabIndex        =   11
      Top             =   600
      Width           =   975
   End
   Begin VB.Label Label1 
      Alignment       =   1  'Right Justify
      Caption         =   "Step:"
      Height          =   255
      Left            =   240
      TabIndex        =   2
      Top             =   960
      Width           =   495
   End
End
Attribute VB_Name = "frmRay"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
' RayTrace V1.1.13

' ---!!!!SPEED IMPROVED!!!!---
' Now this program features scanline culling! It
' checks if a so-called scanline plane intersects
' any objects. If not, it skips tracing all the
' rays on a scanline. This improves speed quite
' a lot! One disappointment of this technique is
' that it is only performed good on spheres, but
' it will be improved with later versions

' If you want to learn the geometry (FindT and
' FindHitColor functions) of the objects, start
' with the sphere. This is the most simple object.
' For further documentation on the sphere, look at
' the HTML page included in the ZIP.

' For more information about Ray Tracing and the
' geometry of objects, look for the book Visual Basic
' Graphics Programming, Second Edition, by Rod
' Stephens, published by Wiley. (ISBN 0-471-35599-2)

' For experts on ray tracing, there is even a new
' technique, called radiosity. This is extremely
' complex, and it generates the most photo-realistic
' images ever generated by computers. It can realize
' real ambient lighting, really generated by the
' reflection of light caused by nearby objects. It
' can also analyze the light spectrum with the colors
' of the rainbow caused by prism's. This is extremely
' difficult, and quite slow for a personal computer.
' (You should let work a Cray supercomputer on radiosity
' for a little speed.)
' For more information about radiosity, consult the
' latest graphics research literature.

Option Explicit

Private Sub cmdRender_Click()
    Dim Obj As RayTraceable
    Dim T As Single
    If Running = False Then
        T = Timer
        For Each Obj In Objects
            Obj.ResetCulling
        Next Obj
        
        ' Show an error message when the inserted values
        ' are not numeric
        If Not ((IsNumeric(txtEyeR)) And (IsNumeric(txtEyePhi)) And (IsNumeric(txtEyeTheta))) Then
            MsgBox "Enter numeric values", , "Ray"
            Exit Sub
        End If
        Running = True
        
        ' Set the eye's position
        EyeR = CSng(txtEyeR.Text)
        EyePhi = CSng(txtEyePhi.Text)
        EyeTheta = CSng(txtEyeTheta.Text)
        
        ' Change the caption of the commandbutton
        cmdRender.Caption = "Stop"
        
        ' Clear the picturebox
        pic1.Cls
        
        ' Render
        Render pic1, txtStep
        
        ' Set the caption of the button back to "Render"
        cmdRender.Caption = "Render"
        lblTime = Timer - T & " sec"
    Else
        ' Stop ray tracing
        Running = False
        cmdRender.Caption = "Render"
        lblTime = Timer - T & " sec"
    End If
End Sub

Private Sub Form_Load()
    Dim Sphere1 As Sphere
    Dim Sphere2 As Sphere
    Dim Sphere3 As Sphere
    Dim Sphere4 As Sphere
    Dim Cyl1 As Cylinder
    Dim Cyl2 As Cylinder
    Dim Cyl3 As Cylinder
    Dim Cyl4 As Cylinder
    Dim Cyl5 As Cylinder
    Dim Cyl6 As Cylinder
    Dim Disk1 As Disk
    Dim Light1 As LightSource
    Dim Light2 As LightSource
    
    ' Show the form
    Me.Show
    DoEvents
    
    ' Set the ambient lighting
    AmbIr = 128
    AmbIg = 128
    AmbIb = 128
    
    ' Set the eye position
    EyeR = 1000
    EyePhi = -0.6
    EyeTheta = -0.3
    
    ' Create new light sources
    Set Light1 = New LightSource
    Set Light2 = New LightSource
        
    ' Set the values of the light sources
    Light1.SetParameters 1000, -500, 1000, 255, 255, 255
    Light2.SetParameters 1000, -500, -1000, 255, 255, 255
    
    ' Add the light sources to the LightSources array
    LightSources.Add Light1
    LightSources.Add Light2
    
    ' Create new spheres
    Set Sphere1 = New Sphere
    Set Sphere2 = New Sphere
    Set Sphere3 = New Sphere
    Set Sphere4 = New Sphere
    
    ' Create new cylinders
    Set Cyl1 = New Cylinder
    Set Cyl2 = New Cylinder
    Set Cyl3 = New Cylinder
    Set Cyl4 = New Cylinder
    Set Cyl5 = New Cylinder
    Set Cyl6 = New Cylinder
    
    ' Create a new disk
    Set Disk1 = New Disk
    
    ' Set the values of the spheres
    Sphere1.SetValues 75, 0, 0, 30, _
        0.6, 0.1, 0.1, _
        0.6, 0.1, 0.1, _
        0.35, 20, _
        0, 0, 0
    Sphere2.SetValues -35, 0, -65, 30, _
        0.1, 0.5, 0.1, _
        0.1, 0.5, 0.1, _
        0.35, 20, _
        0, 0, 0
    Sphere3.SetValues -35, 0, 65, 30, _
        0.1, 0.1, 0.6, _
        0.1, 0.1, 0.6, _
        0.35, 20, _
        0, 0, 0
    Sphere4.SetValues 0, -65, 0, 30, _
        0.6, 0.1, 0.6, _
        0.6, 0.1, 0.6, _
        0.35, 20, _
        0, 0, 0
    ' Set the values of the cylinders
    Cyl1.SetValues 75, 0, 0, -35, 0, -65, 15, _
        0.1, 0.1, 0.6, _
        0.1, 0.1, 0.6, _
        0.35, 20, _
        0, 0, 0
    Cyl2.SetValues -35, 0, -65, -35, 0, 65, 15, _
        0.6, 0.1, 0.1, _
        0.6, 0.1, 0.1, _
        0.35, 20, _
        0, 0, 0
    Cyl3.SetValues -35, 0, 65, 75, 0, 0, 15, _
        0.1, 0.5, 0.1, _
        0.1, 0.5, 0.1, _
        0.35, 20, _
        0, 0, 0
    Cyl4.SetValues 75, 0, 0, 0, -65, 0, 15, _
        0.6, 0.1, 0.6, _
        0.6, 0.1, 0.6, _
        0.35, 20, _
        0, 0, 0
    Cyl5.SetValues -35, 0, -65, 0, -65, 0, 15, _
        0.6, 0.6, 0.1, _
        0.6, 0.6, 0.1, _
        0.35, 20, _
        0, 0, 0
    Cyl6.SetValues -35, 0, 65, 0, -65, 0, 15, _
        0.1, 0.5, 0.5, _
        0.1, 0.5, 0.5, _
        0.35, 20, _
        0, 0, 0
        
    ' Set the values of the disk
    Disk1.SetValues 0, 30, 0, 0, -31, 0, 125, 0.1, 0.1, 0.1, _
        0.1, 0.1, 0.1, 0.35, 20, 0.9, 0.9, 0.9
    
    ' Add the objects to the objects array
    Objects.Add Sphere1
    Objects.Add Sphere2
    Objects.Add Sphere3
    Objects.Add Sphere4
    Objects.Add Cyl1
    Objects.Add Cyl2
    Objects.Add Cyl3
    Objects.Add Cyl4
    Objects.Add Cyl5
    Objects.Add Cyl6
    Objects.Add Disk1
    
    ' Uncomment the following line for a DNA-like structure:
    'DNACreate
    ' If you did, comment the object adding lines
    ' in this sub.
    
    ' Render preview
    PRunning = True
    PreviewRender picPreview, 3
End Sub

Private Sub Form_Unload(Cancel As Integer)
    End
End Sub

Private Sub txtEyePhi_Change()
    If IsNumeric(txtEyePhi) Then
        EyePhi = CSng(txtEyePhi)
        picPreview.Cls
        PRunning = True
        PreviewRender picPreview, 3
    End If
End Sub

Private Sub txtEyeTheta_Change()
    If IsNumeric(txtEyeTheta) Then
        EyeTheta = CSng(txtEyeTheta)
        picPreview.Cls
        PRunning = True
        PreviewRender picPreview, 3
    End If
End Sub

Private Sub DNACreate()
    Dim Sphere As Sphere
    Dim Bases(1 To 2, 1 To 40) As Sphere
    Dim Helix(1 To 2, 1 To 40) As Sphere
    Dim i
    Dim Rand As Single
    For i = 1 To 40
        Set Bases(1, i) = New Sphere
        Set Bases(2, i) = New Sphere
        Set Helix(1, i) = New Sphere
        Set Helix(2, i) = New Sphere
    Next i
    For i = 1 To 40
        Rand = Rnd
        If Rand < 0.5 Then
            Bases(1, i).SetValues 15 * Sin(i / 3), _
                (i) * 7.5 - 150, 15 * Cos(i / 3), 10, _
                0.6, 0.1, 0.1, _
                0.6, 0.1, 0.1, _
                0.35, 20, _
                0, 0, 0
            Bases(2, i).SetValues 15 * Sin(i / 3 + 1.5707963), _
                (i) * 7.5 - 150, 15 * Cos(i / 3 + 1.5707963), 10, _
                0.1, 0.6, 0.1, _
                0.1, 0.6, 0.1, _
                0.35, 20, _
                0, 0, 0
        ElseIf Rand >= 0.5 Then
            Bases(1, i).SetValues 15 * Sin(i / 3), _
                (i) * 7.5 - 150, 15 * Cos(i / 3), 10, _
                0.1, 0.1, 0.6, _
                0.1, 0.1, 0.6, _
                0.35, 20, _
                0, 0, 0
            Bases(2, i).SetValues 15 * Sin(i / 3 + 1.5707963), _
                (i) * 7.5 - 150, 15 * Cos(i / 3 + 1.5707963), 10, _
                0.6, 0.1, 0.6, _
                0.6, 0.1, 0.6, _
                0.35, 20, _
                0, 0, 0
        End If
    Next i
    For i = 1 To 40
        Helix(1, i).SetValues 25 * Sin(i / 3), _
            (i) * 7.5 - 150, 25 * Cos(i / 3), 10, _
            0.6, 0.6, 0.6, _
            0.6, 0.6, 0.6, _
            0.35, 20, _
            0, 0, 0
        Helix(2, i).SetValues 25 * Sin(i / 3 + 1.5707963), _
            (i) * 7.5 - 150, 25 * Cos(i / 3 + 1.5707963), 10, _
            0.6, 0.6, 0.6, _
            0.6, 0.6, 0.6, _
            0.35, 20, _
            0, 0, 0
    Next i
    For i = 1 To 40
        Objects.Add Bases(1, i)
        Objects.Add Bases(2, i)
    Next i
    For i = 1 To 40
        Objects.Add Helix(1, i)
        Objects.Add Helix(2, i)
    Next i
End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -