שיעור 6.1 – יצירת כלי רכב ממונעים

יצירת מכונית

ניתן ליצור מגוון כלי רכב אשר נוסעים במרחב.

בניית המכונית

ראשית, יש לבנות את השלד של המכונית

לחצו לחיצה ימנית של העכבר על האדמה ולאחר מכן על כפתור CREATE,

ובלשונית OBJECT שנו את הערכים בשלושת הצירים X,Y,Z כפי שמופיע בתמונה

תחת גודל (SIZE)

בציר ה X שנו את האורך ל 2 מטר

בציר ה Y שנו את הרוחב ל 1 מטר

בציר ה Z שנו את הגובה ל 0.3

שכפלו את המכונית על ידי לחיצה על כפתור SHIFT ולגרור את התיבה כלפי מעלה.

  •  מקמו את התיבה העליונה צמוד ומעל לתיבה התחתונה.

בלשונית OBJECT יש ליצור חלל בתיבה העליונה על ידי שינוי הערכים באפשרות של HOLLOW.

בנו עוד קוביה בתוך החלל שישמש כמושב האווטאר.

התאימו את הגודל באמצעות לחיצה ואחזקה של מקשי CTRL+SHIFT

עכשיו יש לחבר את שלושת החלקים.

בחרו בחלקים על ידי לחיצה על כל חלק באמצעות העכבר יחד עם לחיצה רציפה על מקש ה SHIFT.

הקפידו שהמושב יהיה החלק האחרון אותו אתם בוחרים, ולחצו על כפתור LINK.
החלק האחרון שנוסף הוא החלק המוביל של כל הקבוצה ונשאר עם מסגרת עדינה צהובה בעוד שכל החלקים האחרים מקבלים מסגרת בצבע תכלת

אם החיבור בין שלושת החלקים נעשה בצורה נכונה, עילה תכולה תופיע מסביב לבנייה.

היכנסו לתפריט הבנייה שוב, ובחרו בגליל כדי ליצור את הגלגלים.

התאימו את הגודל וסובבו אותו, ולאחר מכן יש למקם אותו מתחת לשלד.

שכפלו את הגליל ליצירת גלגל נוסף על ידי לחיצה על SHIFT ולגרור אותו אל המקום המיועד לגלגל השני.

לאחר יצירת הגלגלים, סמנו אותם באמצעות העכבר תוך כדי לחיצה על כפתור SHIFT, וחברו אותם אל המכונית הקפידו לבחור את המכונית אחרונה כך שהחלק המוביל ישאר כרית הרכב.

לאחר סימון כל חלקי המכונית לחצו על כפתור LINK בתפריט העריכה

על מנת להוסיף צבע לכל חלק במכונית בניפרד, יש לסמן בתפריט העריכה את האפשרות של EDIT LINKED.

כאשר האפשרות של EDIT LINKED מסומנת, יש לבחור בכל חלק בנפרד,

ובלשונית TEXTURE לשנות את הצבע כרצונכם.

תוכלו להוסיף למכונית מראה מטאלי וברק בלשונית TEXTURE,

על ידי סימון ב SHININESS בשלוש רמות של ברק.

הוספת ה SCRIPT

לאחר שהמכונית מוכנה, יש להוסיף את הSCRIPT אשר יגרום לה לנוע במרחב.

לצורך כך קיימים שתי דרכים:

הדרך הראשונה היא לגשת לקופסה המכילה את הSCRIPT.

יש לבצע טלפורט לאי בשם Eurekacenter1

ניתן למצוא את התיבה בחנות ליד הכיכר המרכזית.

לחצו עליה ו לחצו על כפתור ACCEPT בתיבת הדיאלוג שנפתחה בצד ימין. 

את  הSCRIPT תקבלו ישירות

תחת לשונית RECENT

פתחו את לשונית RECENT בה תמצאו תיקייה בשם CAR GIVER,

בתוכה יהיה פריט בשם VEHICLE SCRIPT.

גררו את הפריט הנ"ל (ה SCRIPT) אל המכונית.

הדרך השניה, היא על ידי יצירת SCRIPT חדש והעתקת הSCRIPT.

בתפריט העריכה יש לפתוח את לשונית הCONTENT,

וללחוץ על כפתור NEW SCRIPT

לאחר שה SCRIPT החדש ייפתח, יש למחוק את כל התוכן הקיים ולהעתיק ולהדביק את הקוד הבא בדיוק כפי שמופיע להלן,

לאחר העתקת ה SCRIPT,

יש לשמור את השינויים על ידי כפתור SAVE

// :CATEGORY:Vehicles
// :NAME:SuperCar
// :AUTHOR:Encog Dod
// :CREATED:2010-01-10 05:20:56.000
// :EDITED:2013-09-18 15:39:05
// :ID:849
// :NUM:1179
// :REV:1.0
// :WORLD:Second Life
// :DESCRIPTION:
// SuperCar
// :CODE:
// From the book:
//
// Scripting Recipes for Second Life
// by Jeff Heaton (Encog Dod in SL)
// ISBN: 160439000X
// Copyright 2007 by Heaton Research, Inc.
//
// This script may be freely copied and modified so long as this header
// remains unmodified.
//
// For more information about this book visit the following web site:
//
// http://www.heatonresearch.com/articles/series/22/

float forward_power = 15; //Power used to go forward (1 to 30)
float reverse_power = -12; //Power ued to go reverse (-1 to -30)
float turning_ratio = 2.0; //How sharply the vehicle turns. Less is more sharply. (.1 to 10)
string sit_message = "Ride"; //Sit message
float VERTICAL_THRUST = 7;

float ROTATION_RATE = 2.0;      //  Rate of turning 

becomeCar()
{
    //car
    llSetVehicleType(VEHICLE_TYPE_CAR);
    llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY, 0.2);
    llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_EFFICIENCY, 0.80);
    llSetVehicleFloatParam(VEHICLE_ANGULAR_DEFLECTION_TIMESCALE, 0.10);
    llSetVehicleFloatParam(VEHICLE_LINEAR_DEFLECTION_TIMESCALE, 0.10);
    llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_TIMESCALE, 1.0);
    llSetVehicleFloatParam(VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE, 0.2);
    llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_TIMESCALE, 0.1);
    llSetVehicleFloatParam(VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE, 0.5);
    llSetVehicleVectorParam(VEHICLE_LINEAR_FRICTION_TIMESCALE, <1000.0, 2.0, 1000.0>);
    llSetVehicleVectorParam(VEHICLE_ANGULAR_FRICTION_TIMESCALE, <10.0, 10.0, 1000.0>);
    llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.50);
    llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 0.50);
    llSay(0,"car");
}

default
{
    on_rez(integer start_param)
    {
         llResetScript();
        }
        
    state_entry()
    {
        llSetSitText(sit_message);
        // forward-back,left-right,updown
        llSitTarget(<0.4,0.0,0.45>, ZERO_ROTATION );
        
        llSetCameraEyeOffset(<-4, 0.0, 2.0>);
        llSetCameraAtOffset(<2.0, 0.0, 2.0>);
        becomeCar();
      } 
        
    changed(integer change)
    {
        
        
        if (change & CHANGED_LINK)
        {
            
            key agent = llAvatarOnSitTarget();
            if (agent)
            {                
                    llSay(0,"Welcome to the super car");
                    llSleep(.4);
                    llSetStatus(STATUS_PHYSICS, TRUE);
                    llSleep(.1);
                    llRequestPermissions(agent, PERMISSION_TRIGGER_ANIMATION | PERMISSION_TAKE_CONTROLS);
             }
             
            if (agent==NULL_KEY)
            {
                             
                llSetStatus(STATUS_PHYSICS, FALSE);
                llSleep(.1);
                llMessageLinked(LINK_ALL_CHILDREN , 0, "WHEEL_DEFAULT", NULL_KEY);
                llSleep(.4);
                llReleaseControls();
                llTargetOmega(<0,0,0>,PI,0);
                
                
            }
        }
        
    }
    
    run_time_permissions(integer perm)
    {
        if (perm) {
            llTakeControls(CONTROL_FWD | CONTROL_BACK | CONTROL_RIGHT | CONTROL_LEFT | CONTROL_ROT_RIGHT | CONTROL_ROT_LEFT | CONTROL_UP | CONTROL_DOWN, TRUE, FALSE);
        }
    }
    
    control(key id, integer level, integer edge)
    {
        integer reverse=1;
        vector angular_motor;
        
        //get current speed
        vector vel = llGetVel();
        float speed = llVecMag(vel);
        

        //car controls
        if(level & CONTROL_FWD)
        {
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <forward_power,0,0>);
            reverse=1;
        }
        if(level & CONTROL_BACK)
        {
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <reverse_power,0,0>);
            reverse = -1;
        }

        if(level & (CONTROL_RIGHT|CONTROL_ROT_RIGHT))
        {
            angular_motor.z -= turning_ratio;
        }
        
        if(level & (CONTROL_LEFT|CONTROL_ROT_LEFT))
        {
            angular_motor.z += turning_ratio;
        }
        
        if(level & CONTROL_UP) {
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,VERTICAL_THRUST>);
        } else if (edge & CONTROL_UP) {
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,0>);
        }
        if(level & CONTROL_DOWN) {
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,-VERTICAL_THRUST>);
        } else if (edge & CONTROL_DOWN) {
            llSetVehicleVectorParam(VEHICLE_LINEAR_MOTOR_DIRECTION, <0,0,0>);
        }

        llSetVehicleVectorParam(VEHICLE_ANGULAR_MOTOR_DIRECTION, angular_motor);


    } //end control  
    
    
    
} //end default

לאחר שה SCRIPT התקבל במכונית,

יש ללחוץ לחיצה ימנית על המכונית ולבחור באפשרות RIDE

כאשר האוואטאר ישב על מושב המכונית,

יש לרשום את המילה DRIVE בשדה של הצ'ט

על מנת שהמכונית תתחיל לנסוע באמצעות החיצים במקלדת.