تبليغاتX
Iranian Technology
 
آموزش برنامه نویسی
 
 
آموزش ویژوال بیسیک و ... برای دیدن تمامی مطالب به آرشیو ماهانه مراجعه کنید
 

نور پردازی در OpenGL باعث میشه که صحنه هایی که خلق میشن طبیعی به نظر برسن. خودتون وقتی این کار رو انجام دادین می فهمین  . نورپردازی کار بسیار ساده و جالبیه . در این پست ما مقداری تغییر در کد نمونه برنامه ی قبل ایجاد می کنیم . پس اول نمونه برنامه ی پست قبل رو دانلود کنید ( از اینجا هم می تونید دانلود کنید.) . خوبه .!!

برای کار نورپردازی ما نیاز به سه آرایه داریم . آرایه ی اول ( Ambient ) : مشخص کننده ی رنگ محدوده و اطراف اشکال است که نور به آنجا تابیده نمی شود . آرایه ی دوم ( Diffuse ) : مشخص کننده ی رنگ و شدت نوری است که به شکل پاشیده می شود . آرایه ی سوم ( Position ) : مشخص کننده ی مکان و مختصات منبع نور است .

هر کدام از این آرایه ها دارای ۴ اندیس یا عضو هستند . در دو آرایه ی اول سه عضو اول آرایه مشخص کننده ی رنگ R,G,B هستند و عضو آخر مقدار Alpha است که شدت نور رو مشخص می کنه .
اما در آرایه ی سوم (
Position) سه عضو اول آرایه مشخص کننده ی X,Y,Z هستند که مشخص کننده ی مختصات منبع نور هستند .

خوب میریم سراغ نوشتم کدها :
بعد از دانلود کردن نمونه برنامه ی پست قبل اون رو باز کنید . مدول
OpenGLMain رو باز کنید و بعد در قسمت General این مدول سه آرایه رو تعریف کنید به این صورت :

Dim LA(3) As GLFloat
Dim LD(3) As GLFloat
Dim LP(3) As GLFloat

بعد از اعلان کردن این سه آرایه یه تابع به اسم SetLighting را مینویسیم که کار نورپردازی رو انجام بده . پس در آخر کدهای مدول OpenGLMain این کدها رو بنویسید :

Public sub SetLighting()     'x

    LA(0) = 0
    LA(1) = 0
    LA(2) = 0
    LA(3) = 1

    LD(0) = 1
    LD(1) = 0
    LD(2) = 0
    LD(3) = 1

    LP(0) = -1
    LP(1) = 1
    LP(3) = 0
    LP(4) = 1

    glLightFv  ltLight1 , lpmAmbient , LA(0)
    glLightFv  ltLight1 , lpmDiffuse , LD(0)
    glLightFv  ltLight1 , lpmPosition , LP(0)
    glEnable  glcLight1
    glEnable  glcLighting

End Sub

در تابع بالا ۱۲ خط اول برای مشخص کردن رنگ و شدت نور و مختصات منبع نور هست که درباره ی اونها توضیح دادم . در خط ۱۳ و ۱۴و ۱۵ به وسیله ی تابع glLightFv مقادیر آرایه هایی که ست کردیم رو برای نورپردازی به OpenGL اعلام می کنیم . در خط ۱۶ و ۱۷ هم کار نورپردازی رو به وسیله ی تابع glEnable فعال می کنیم .

بعد از نوشتن تابع SetLighting باید یه جایی از برنامه اون رو فراخوانی کنیم . ما فراخوانی تابع SetLighting را در داخل تابع InitGL() انجام میدهیم پس در خط اول این تابع کد زیر رو بنویسید :

SetLighting

همین . حالا برنامه رو اجرا کنید و حالشو ببرین . دیدین که چقدر آسون بود !!

همون طور که که در تابع SetLighting در قسمت مقداردهی آرایه LD()  'x می بینید اولین اندیس از این آرایه رو با ۱ مقدار دهی کردیم و اندیس ۲ و اندیس ۳ رو با ۰ مقداردهی کردیم که نشان دهنده ی رنگ قرمزه . آخرین اندیس از این آرایه شدت نوریه که تابیده میشه به طوری که هر چه کمتر باشه میزان نور کمتر میشه .
اینم نمونه برنامش : دانلود کنید

 


 

جواب به سؤالات :

۱ - سامان گفته بود که یه برنامه می خواد بنویسه که تمامی فایل های txt رو از روی هارد دیسک پاک کنه !؟

برای این کار شما می تونید از کتابخانه ی Scripting و کلاس FSO استفاده کنید . ابتدا به  کدها و نمونه برنامه های زیر توجه کنید . البته قبل از همه ی اینها بعد از باز کردن ویژوال بیسیک و پروژه ی استاندارد از منوی Project -> References رو انتخاب کنید تا پنجره ی References باز بشه بعد به دنبال Microsoft Scripting Runtime بگردین و بعد از علامت دار کردن OK کنید .

یک عدد CommandButton به فرم اضافه کنید و روی آن جفت کلیک کنید تا رویداد Click اون نوشته بشه و بعد بنویسید :

 

Private sub Command1_Click  ()  'x

 

    Dim FSO As New Scripting.FileSystemObject
    Dim Folder As Scripting.Folder
    Dim File As Scripting.File

 

    set Folder = Fso.GetFolder("C:\Windows\")
    For Each File In Folder.Files
        MsgBox File
    Next

 

    Set FSO = Nothing

End Sub

 

 

بعد از اجرای برنامه و کلیک کردن Command1 همه ی فایل هایی که در داخل مسیر C:\Windows وجود دارند در جعبه پیام نمایش داده می شوند .


سه خط اول برای اعلان کلاس FSO و Folder و File هستند . در خط چهارم برای مقدار دهی به Folder از تابع GetFolder موجود در کلاس FSO استفاده می کنیم. در خط پنجم به وسیله ی یک حلقه ی For Each تمامی فایل های موجود در Folder رو با جعبه پیام نشان می دهیم. در خط آخر هم حافظه ی اختصاص یافته به FSO رو آزاد می کنیم.

 

حالا به جای کد بالا این کد رو امتحان کنید :

 

Private sub Command1_Click  ()  'x

 

    Dim FSO As New Scripting.FileSystemObject
    Dim Folder As Scripting.Folder
    Dim SubFolder As Scripting.Folder

 

    set Folder = Fso.GetFolder("C:\Windows\")
    For Each SubFolder  In  Folder.SubFolders
        MsgBox SubFolder
    Next

 

    Set FSO = Nothing

End Sub

 

حالا اگه کد برنامه ی بالا رو اجرا کنید با کلیک کردن دکمه فرمان تمامی فولدر های موجود در C:\Windows در جعبه پیام نمایش داده میشوند.

 

ما به کمک این دو قطعه کد می تونیم برنامه ای بنویسیم که تمامی فولدر های موجود در یک درایو رو پیدا کنه بعد فایل های موجود در فولدرها رو پیدا کنه . همچنین می تونیم شرطی بزاریم که اگه خواستیم فایل های خاصی رو دست کاری کنه مثلآ پاک کنه یا مخفی کنه!!.

 

ساختن برنامه ای برای پیدا کردن تمامی فایل های txt موجود در درایو C:\       'x  :::×:::>

 

یه پروژه ی استاندارد باز کنید و یک عدد ListBox و دوعدد CommandButton روی فرم قرار بدین . خاصیت Caption مربوط به Command1 رو به Find تغییر بدین و خاصیت Caption مربوط به Command2 رو به Del *.txt تغییر بدین. حالا از منوی View -> Code رو کلیک کنید تا پنجره ی کدها باز بشه :

 

 

Private Sub FindTXT(Path As String)  'x

 

    Dim FSO As New Scripting.FileSystemObject
    Dim Folder As Scripting.Folder
    Dim SubFolder As Scripting.Folder
    Dim File As Scripting.File

 

    Set Folder = FSO.GetFolder ( Path )    'x
    For Each File In Folder.Files
        If  LCase(Right(File,3)) = "txt" Then
            List1.AddItem  File
        End If
    Next

 

    For Each SubFolder In Folder.SubFolder
        FindTXT  SubFolder.Path
    Next

 

    Set FSO = Nothing

End Sub

 

Private Sub Command1_Click()  'x

    FindTXT   "C:\"              'x

End Sub

 

Private Sub Command2_Click()    'x

 

    Dim I As Integer
    For  i = 0 to List1.ListCount - 1
        Kill   List1.List(i)   'x
    Next

 

End Sub

 

 

در قطعه کد بالا ابتدا یک تابع برای پیدا کردن فایل های txt نوشتیم. همون طور که دیدید این تابع یک آرگومان داره و آرگومانش مسیری است که می خواد فایل های txt اون رو پیدا کنه . 10 خط اول این تابع که نیازی به توضیح نداره اما در خط 11 تا 13 ما به وسیله ی یک حلقه ی For Each زیر فهرست های مسیر جاری ( که در اینجا C:\ 'x است) رو پیدا میکنیم و بعد از به دست آوردن مسیر آن زیر فهرست  دوباره این تابع رو با مسیر جدید فراخوانی می کنیم . اگه توجه کرده باشین این تابع خودش خودش رو فراخونی میکنه . به اینجور توابع ، توابع بازگشتی می گن . سعی می کنم یه کم توضیح درباره ی این تابع بازگشتی بدم به طوری که بفهمین .

 

 

وقتی که این تابع فراخوانی میشه ابتدا فایل های موجود در مسیر C:\ 'x رو چک می کنه . بعد از تمام شدن کار چک کردن فایل ها اولین فولدر موجود در مسیر C:\ 'x رو پیدا می کنه (مثلا Windows) و دوباره تابع رو فراخوانی میکنه اما این بار با مقدار C:\Windows\  'x فراخوانی میشه (چون در این مرحلهSubFolder.Path = C:\Windows\ 'x هست) . حالا شروع به چک کردن فایل های موجود در مسیر جاری یعنی C:\Windows\  'x می کنه. به همین ترتیب کل فایل های درایو C:\ 'x رو چک می کنه.

امیدوارم با این توضیحات درهم برهم من چیزی فهمیده باشین  .  فکر نکنم بقیه ی کدها نیازی به توضیح داشته باشن . اینم نمونه برنامش : دانلود

 


 

2 - سمیرا به دنبال یه برنامه می گشت که عددهایی رو به عنوان مختصات و ... از کاربر دریافت کنه و با توجه به اون عددها اشکالی رو رسم کنه .
اینم نمونه برنامش اگه دیگران هم خواستن دانلود کنن مسایل آموزشی خوبی داره : دانلود


 

مریم خانوم هم گفته بود که تا قبل از 4/4/87 آموزش نورپردازی و حالت شیشه در OpenGL رو بزارم اما به علت اینکه من امروز یعنی 5/4/87 به اینترنت متصل شدم و نظرات رو خوندم دیگه نتونستم . از این که دیر آپ کردم شرمنده .

 

سوالات همش دوتا بود . تموم شد.

 

خوب دیگه برای امروز کافیه. خسته شدم ، دستم دیگه درد گرفت  .
چیه ؟ 
 ناراحت شدین پست امروز تموم شد ؟ نترسین دوباره میام .
بنابراین تا بعد تا میتونین نظر بدین . نظرتون رو راجع به آموزش ها بزارین . چه جوریه ؟ خوبه یا بده ؟ حتمآ بگین . اگه نظرا کم باشه پست بعدی رو نمیزارم ها!! 

 

بدرود .

 |+| نوشته شده در  چهارشنبه پنجم تیر 1387ساعت 20:2  توسط علی  | 
 
  بالا  

Free Counter