Jump to content

Miguelito Shilova

Resident
  • Posts

    98
  • Joined

  • Last visited

Everything posted by Miguelito Shilova

  1. Thanks! I will try these changes this evening. The shift-copy doesn't concern me too much, but what about the notecard edits? Can I avoid that by ensuring the notecard is only edited when the cover in the stretched position? If so, is there a path I could take with the code that ensures this, like maybe a call in the default state_entry using Llsetlinkprimitiveparamsfast and defining its size?
  2. <facepalm> "oy vey" </facepalm> You're right, it is. I've applied it to 'state OK' ... state OK{ state_entry() { llSetTimerEvent(10.0); llSay(0,"You're in!"); offset *= ((1.0 - min) / ns) * (offset * llGetScale()); hi_end_fixed -= 0.5; } changed(integer change) { if (change & CHANGED_INVENTORY) { llResetScript(); } } touch_start(integer detected) { integer i; do llSetPrimitiveParams([PRIM_SIZE, llGetScale() - offset, PRIM_POSITION, llGetLocalPos() + ((hi_end_fixed * offset) * llGetLocalRot())]); while ((++i) < ns); offset = - offset; } timer() // Return to previous state if nothing else happens before timer triggers. //I think we need to enter some events here that set values check the current position and size of the cover and reverse the motion and size { llSetTimerEvent(0.0); state running; }} That made some progress. What I am seeing now is that on the second click (after the whitelist is checked against my login name), the cover will correctly move to the open position, and then to the close position when clicked again. But when I click it again after a certain period of time, regardless if it's in the open or closed state, the cover 'barely' moves - you just see just a little bit of shifting. I also noticed when the process repeats again, no discernable movement is shown. I suspect the problem is that my variables are not retaining workable values for the calculation after the timer expires and the script is returned to the running state. I just don't know how to solve for that. I'm hoping this is a common problem, and my post here will help provide additional resources for others looking to solve something similar. I certainly appreciate any help I can get. Thanks again! --Mig
  3. One clarification, in reading my commentary on physics, I wanted to point out that the root prim is also physics prim (along with the cover), but the rest are physics none.
  4. I've got an issue that I suspect the solution is so simple, that my inexperienced mind just isn't seeing it - I hope someone can spot the problem(s) - thanks in advance for your help. What I am doing is combining two scripts to create a whitelist controlled cover. I have a 'tub' that is comprised of four mesh components (including the cover with this script included in it) and two standard prims. One prim is invisible and serves as the root prim. Aside from the cover, all the other prims (including the other standard prim that serves as 'water') are set to physics none - the cover, although a mesh, is set to physics prim. Here is what it looks like with the cover rolled up. The cover is the dark line on the backside top edge (NOTE: the cover is not the root prim). And here is what it looks like with the cover 'extended' The intent is to use the cover to control access to the tub. I'm using Zilla Larson's rollup blind script to facilitate the rollup effect when touched. By itself it works just fine as you can see from the two images above. Here is the standalone blind script: //When touched the prim is retracted towards one end and when touched again stretched back out. // //Prim moves/changes size along the local coordinate specified in the offset vector below. // //To change the overall size, edit the prim when stretched out and reset the script when done. // //The script works both in unlinked and linked prims. // // Copyright (C) 2008 Zilla Larsson // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License version 3, as // published by the Free Software Foundation. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/> vector offset = <1,0,0>; //Prim moves/changes size along this local coordinate float hi_end_fixed = FALSE; //Which end of the prim should remain in place when size changes? //The one with the higher (local) coordinate? float min = 0.05; //The minimum size of the prim relative to its maximum size integer ns = 10; //Number of distinct steps for move/size change default { state_entry() { offset *= ((1.0 - min) / ns) * (offset * llGetScale()); hi_end_fixed -= 0.5; } touch_start(integer detected) { integer i; do llSetPrimitiveParams([PRIM_SIZE, llGetScale() - offset, PRIM_POSITION, llGetLocalPos() + ((hi_end_fixed * offset) * llGetLocalRot())]); while ((++i) < ns); offset = - offset; } } I'm attempting to use this script as the 'event' in Rolig Loon's Whitelist script. Here is the script where I have combined the above with the whitelist script: // Generic Whitelist Script -- Rolig Loon -- March 2011 // Put login names (NOT Display names) of avatars to be whitelisted in a notecard, one per line // Spelling and capitalization count list gWhiteList = []; string gCard; integer gLine; key gQuery; list gWho = ["Me Only","Group","List","Group+List","Everyone"]; integer gAccess; integer gDChnl; // declarations for the opening and closing cover ... vector offset = <1,0,0>; //Prim moves/changes size along this local coordinate float hi_end_fixed = FALSE; //Which end of the prim should remain in place when size changes? //The one with the higher (local) coordinate? float min = 0.05; //The minimum size of the prim relative to its maximum size integer ns = 10; //Number of distinct steps for move/size change default // Read Whitelist from notecard, one name per line { state_entry() { if(llGetInventoryNumber(INVENTORY_NOTECARD) == 1) { gCard = llGetInventoryName(INVENTORY_NOTECARD,0); gQuery = llGetNotecardLine(gCard, 0); } else { llOwnerSay("The whitelist notecard is missing."); } } changed(integer change) { if (change & CHANGED_INVENTORY) { llResetScript(); } } dataserver(key QID, string data) { if(gQuery == QID) { if (data != EOF) { gWhiteList += [llStringTrim(data,STRING_TRIM)]; gQuery = llGetNotecardLine(gCard, ++gLine); } else { llOwnerSay("Initialized"); state running; } } } } state running { state_entry() { gDChnl = (integer) ("0xF" + llGetSubString(llGetOwner(),0,6)); } changed(integer change) { if (change & CHANGED_INVENTORY) { llResetScript(); } } touch_start(integer total_number) { llResetTime(); integer idx = llListFindList(gWhiteList,[llDetectedName(0)]); if (llDetectedKey(0) != llGetOwner()) { if ((gAccess == 4) || ((gAccess == 3) && (~idx || llSameGroup(llDetectedKey(0)))) || ((gAccess == 2) && (~idx)) || ((gAccess == 1) && (llSameGroup(llDetectedKey(0))))) { llSay(0,"Access granted."); state OK; } else { llSay(0,"Access denied."); } } } touch_end(integer num) //Mouse button released { if(llDetectedKey(0) == llGetOwner()) { if (llGetTime() < 3.0 ) //Less than 3 seconds after mouse button down { llSay(0,"Access granted."); state OK; } else if (llGetTime() >= 3.0 ) // Owner set access permissions { llListen(gDChnl,"","",""); llDialog(llGetOwner(),"Who should have access?",gWho,gDChnl); } } } listen(integer channel, string name, key id, string msg) { gAccess = llListFindList(gWho,[msg]); string temp; if (gAccess == 0) { temp = "you only."; } else if (gAccess == 1) { temp = "group members only."; } else if (gAccess == 2) { temp = " \n" + llDumpList2String(gWhiteList," \n"); } else if (gAccess == 3) { temp = "this group and " + " \n" +llDumpList2String(gWhiteList, " \n"); } else { temp = "everyone."; } llOwnerSay("Access has been granted to " + temp); } } state OK { state_entry() { llSetTimerEvent(10.0); llSay(0,"You're in!"); } changed(integer change) { if (change & CHANGED_INVENTORY) { llResetScript(); } } touch_start(integer detected) { integer i; do llSetPrimitiveParams([PRIM_SIZE, llGetScale() - offset, PRIM_POSITION, llGetLocalPos() + ((hi_end_fixed * offset) * llGetLocalRot())]); while ((++i) < ns); offset = - offset; } timer() // Return to previous state if nothing else happens before timer triggers { llSetTimerEvent(0.0); state running; } } I have the notecard in the cover prim as well, and it only has my login name at the moment. When initialized and clicked the script authorizes me, and then with a second click the cover begins to move. Here is where the problems show up ... Upon the second click to open, both sides of the cover extract (not just one) so the cover rolls up to the center (and appears to be thinner than when the cover does not have the combined script: When clicked again to close, the tub sprouts wings :) Again, I am hoping the solution is simple, and would really appreciate some guidance as to what the problem might be. Thanks! --Mig
  5. I have created a mesh scuba gear package being offered for sale in SL and on Marketplace: https://marketplace.secondlife.com/p/GDT-Descend-Scuba-System-Explore-SL-Underwater/6291434 I am looking to partner with someone who can provide a scuba AO to bundle with this package, as I believe that would make the entire package more marketable. The AO would need to include the following animations: underwater swim/fin kickdescent swimascent swimhover/surface float(if possible) water entry - such as a 'giant stride' step off ground/platform AO could take advantage of the home key 'fly' function for swimming as common with other AOs, but would prefer a clean way of water entry (maybe automatically turning on 'fly' at or below water level?) Would consider flat rate payment for project, or a healthy percentage of sales. If you have an AO that comes close to what I am looking for, and would consider a bundle arrangement, I would like to hear from you as well. --Mig
  6. A great big thank you to Emma Krokus who happened to come across the perfect solution for me - thanks Emma!!!!
  7. I'm looking for someone who could provide the following script ... Detect when the prim (worn as an attachment) drops below and comes out of SL waterIf below water, turns on a bubble particle effect and sound fileIf above water, turns them off I already have both the particle effect script and the sound fileThat's all there is to it. I suspect this should be a simple project. Please let me know if you are interested and what your bid would be. I also have other scripting needs and would consider future projects with the right person. Thanks for your interest! IM me if you have questions. Miguelito Shilova (Mig)
  8. Would it be easier to do the hose as a rigged mesh attachment? Let's say the hose included the regulator (mouthpiece) and the attachment point was the mouth. The hose portion of the mesh would be modeled with the bend and would 'wrap around' in a u-shape so as the end opposite of the attachment point would end up at some place behind the avatar's head. If attached to the mouth as a normal mesh attachment, obviously that 'tank end' would not stay still, but could you rig a 'bones' structure within the hose/reg, so those last vertices on the tank end of the hose would have a low weight map, and wouldn't move in comparison to the other ends, which would have higher weight maps? I've started reading up on rigged attachments so I may be making BIG assumptons here, but has anyone tried something similar using rigged meshes - and am I making another big assumption with thinking you can put a bone structure within the attachment itself? Mig
  9. Thanks Rolig and Sassy - I figured the particle effect might be the way to go, as that is what the leash scripts were all about, but I don't understand what you mean by alternating 'objects for the two states, alpha flipped accordingly'. Can you elaborate on that part? Mig
  10. I've played with flexible prims and leash scripts, but I haven't seen anything that could emulate a flexible hose with two attachment points. I'm wanting one point to attach to a scuba tank worn on the back and the other to attach to the regulator attached to the mouth. Can anyone offer suggestions on a starting point for pulling off the effect?
  11. Wow! I've never had a script work right out of the box, but this one did! Thanks again!
  12. I'm using the curtain script found in the script library here as a basis for folding up a boat canopy. The canopy is a mesh that has a ribbed quality to it, and when the script executes it folds up like an accordian. The only issue is that when it folds, it folds to the center of the canopy. The script says with mesh you have to arrange to have the pivot point on one edge. I presume here it's the Y axis, given it's the axis that stays constant. Here are the two states of the canopy ... What I'm looking for is to have it roll back to the stern edge of the canopy frame. In looking around at example functions, I suspect I could combine a llGetPosition function with llSetPosition and apply a vector to it within the same to cause it to shift back while it folds. Here's my modded script ... // Define the large and small sizes of the prim here:- // (if the prim is sliced or path cut, it will appear to be half size on the affected dimension) vector gScaleLarge = <5.0, 0.2, 5.4>; vector gScaleSmall = <0.5, 0.2, 5.4>; integer gSteps = 20; // Number of steps in the shrink/expand process float gSwitch = 1.0; // Action on first touch. +1.0 = shrink, -1.0 = expand default { state_entry() { llSetScale(gScaleLarge); } on_rez(integer x) { llResetScript(); } touch_start(integer total_number) { vector ScaleStep = (gScaleLarge - gScaleSmall) / gSteps; // Compute the scale augment per step vector wscale = llGetScale(); gSwitch *= -1; // Switch between stretch and contract integer i; for ( ; i < gSteps; ++i ) { // It is more lag-friendly to incorporate a sleep per step // Rather than greatly increasing the number of steps llSleep(0.1); llSetScale(wscale + ScaleStep * (float) i * gSwitch); llSetPos(llGetPos() + <0,5,0>); // here's where I'm calling for the shift } } } The script compiles okay, but I don't see any shift - on any axes - despite what values I put into the vector. I only get a slight delay with the folding of the canopy (I suspect due to the built in 0.2 delay with llSetPos). I had supected some sort of detectable movement in one of the axes. Not sure what's missing. I imagine this would be helpful for many builds. Not just boat canopies, but maybe even ones on buildings. Thanks in advance! Mig
  13. I agree that I shouldn't have to manufacture the sounds, and I'm sure I can find something for at least two motor states (idle and running) for looping while the boat is either running or not, and two transition sounds (speed up and slow down) that play only when you cross a speed threshold. I suppose what I'm trying to wrap my mind around is how I would take that throttle cue to determine how I would change between the (now 4) states - maybe the logic would work like this ... if throttle =! 0 play throttle up once; play running as loop; else play throttle down once; play throttle idle; No, I would still have to track the change from 1 and -1 to cue either the throttle up or throttle down sounds to fire, wouldn't I? Otherwise I would get the transition sound at each throttle change. Any suggestion on what that would look like?
  14. Thanks always for your input! That is an interesting suggestion ... I might want to lead up to that as I learn how to script a basic sound file call to a throttle float value transmitted on a channel. Maybe it could be simplfied down to 7 sound files: idle sound (loops) idle pitching up to a medium speed (when speeding up - doesn't loop) medium speed ptiching down to idle (when slowing down - doesn't loop) medium speed (loops) medium speed pitching up to full speed full speed pitching down to medium speed full speed (loops) I'm already broadcasting the throttle setting to child scripts in each prop for a texture rotation. I could include something there that checks that value to a range of values for each of the situations above, with a single range point for each of the two transitions. (sorry - not sure if this is how seasoned programmers talk out what they want to do) I'm seeing this as a series of if/ else if/ else tests, but I don't know how you go about constructing these tests to check for ranges. And given the boat throttle send negative values for reverse throttle (<0 = the boat in reverse), I suppose you would need to handle both sets of ranges. Mig
  15. I would like to find a way to emulate how a motor changes its pitch as it changes speed. I'm thinking of using the throttle float value to determine the pitch the sound. Is there a function in LSL that can change the pitch of a sound file? I suspect you could have multiple sound files pre-recorded at different pitches, but I'm wanting a smooth transition between pitch levels, so I don't know how one can achieve that even with multiple files without affecting the pitch of each file on the transition, and if you have to change pitch, then I think using a single file would be best. Can anyone provide suggestions as to a specific function or a starting point to achieve that kind of result? Thanks for your help! Mig (a slow and blundering, but determined pupil of LSL)
  16. Thanks for the feedback ... Yes, it's true I've looked at prim rotation before. I was able to get the results I wanted, but I was also using a different script, and I simply don't know enough about scripting to fully understand what was different between the two boat scripts. But I do appreciate the Wiki link - I will be diving into that, as it will hopefully help me uncover how the two scripts handled control events to achieve the same result. Mig
  17. OK - I'm seeing some progress. I was able to make a linkset of 5 prims - one base, two rings (torus) and two cylinders, putting the cylinders in the rings to represent the props in the housings. As soon as I started the script and pressed a directional key, the cylinders rotated on the Y axis (round faces up and down), but they and the rings still moved left and right on the Z axis 45 degrees according to the directional input. Is there something that would keep the cylinders from realigining like that? If so, then I might be able to integrate this into the boat script.
  18. I tried using the suggested code from Rolig, but I must not have it in the right spot ... I turned off all scripts in the boat, and deleted the old engine script after turning it off as well. I then unlinked all prims, ran a linknumber script in all four engine prims (both housings, and both impellers), relinked the boat, and captured fresh linknumbers, then turned off and deleted the linknumber scripts. I updated the linknumber declarations as such ... integer PT_RDT = 3;integer PT_Impeller = 5;integer SB_RDT = 2;integer SB_Impeller = 4; The other declarations I left the same as before. Now for the control portion, I updated the declaration labels and added Rolig's code where I thought it was intended ... control(key id, integer held, integer change) { float water_height = llWater(ZERO_VECTOR); vector pos = llGetPos(); float float_diff = pos.z - water_height; if ((change & CONTROL_FWD) || (change & CONTROL_BACK)) { if (held & CONTROL_FWD) { if (throttle < THROTTLE_MAX) { throttle++; } } else if (held & CONTROL_BACK) { if (throttle > THROTTLE_MIN) { throttle--; } } llMessageLinked(LINK_SET,throttle,"throttle",""); // pass throttle setting to child prims } // if (held & CONTROL_UP && float_diff < Z_FLOAT_HEIGHT) { // if (zLinearMotor < Z_MOTOR_MAX) { // zLinearMotor += Z_MOTOR_INCR; } } // else if (held & CONTROL_DOWN) { // if (zLinearMotor > -Z_MOTOR_MAX) { // zLinearMotor -= Z_MOTOR_INCR; } } // else { // zLinearMotor = 0; } if ((held & CONTROL_RIGHT) || (held & CONTROL_ROT_RIGHT)) { if (angMotor.z > 0) { angMotor.z = 0; } else if (angMotor.z > -Z_ANG_MAX) { angMotor.z -= Z_ANG_INCR; llSetLinkPrimitiveParamsFast(SB_RDT, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(PT_RDT, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(SB_Impeller, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(PT_Impeller, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,135.0>*DEG_TO_RAD)]); } } else if ((held & CONTROL_LEFT) || (held & CONTROL_ROT_LEFT)) { if (angMotor.z < 0) { angMotor.z = 0; } else if (angMotor.z < Z_ANG_MAX) { angMotor.z += Z_ANG_INCR; llSetLinkPrimitiveParamsFast(SB_RDT, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,-135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(PT_RDT, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,-135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(SB_Impeller, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,-135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(PT_Impeller, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,-135.0>*DEG_TO_RAD)]); } } if (~( held | change) ){ angMotor = ZERO_VECTOR; llSetLinkPrimitiveParamsFast(SB_RDT, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,PI>)]); llSetLinkPrimitiveParamsFast(PT_RDT, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,PI>)]); llSetLinkPrimitiveParamsFast(SB_Impeller, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,PI>)]); llSetLinkPrimitiveParamsFast(PT_Impeller, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,PI>)]);} else { angMotor = ZERO_VECTOR; } set_motor(); } The net result was only the two impellers moved when I first pressed a control key. They rotated on the X and Z axes and then locked. The engine housings did not move, and the boat would only move forward and backward. I'm hoping the problem is just where I put Rolig's suggested code. Thoughts?
  19. Sorry about the confusion - my mind goes in so many directions at once sometimes I confuse myself :matte-motes-confused: Right now I can get the engine prims to rotate CCW 45 degrees when CONTROL_LEFT is pressed, and can get them to rotate CW 45 degrees when CONTROL_RIGHT is pressed, but I cant get the prims to return to center when either commands are released. Mig
  20. Hi there, and thanks for your response ... You are correct - as per the code above, there isn't anything in the code above that centers the engines. I presume by your example below that I would include the "integer release = ~level & edge;" with the other declarations at the top of the script, but I'm not sure I follow what you mean with the IF statement. Can you elaborate on how that would look, given my code example above? Thanks, Mig
  21. I'm adapting a boat script to handle a pair of rotating engines (2 prims each), that rotate 45 degrees to the left and right whenever the boat turns in the accompanying direction. I can get the prims to turn left and right, but when I release the direction key, the prims do not return to center. Additionally when the script stops (e.g., pilot stands), the engine prims do not return to center either. I declare the engine prim linkset numbers at the top of the script, and this obviously works fine ... integer RDPHousingSB = 12; integer RDPHousingPT = 21; integer RDPPropSB = 17; integer RDPPropPT = 23;The script also declares these values that relate to the turning of the boat ... vector angMotor; float Z_ANG_MAX = 0.5; float Z_ANG_INCR = 0.05;Here is what is in the boat controls section ... control(key id, integer held, integer change) { float water_height = llWater(ZERO_VECTOR); vector pos = llGetPos(); float float_diff = pos.z - water_height; if ((change & CONTROL_FWD) || (change & CONTROL_BACK)) { if (held & CONTROL_FWD) { if (throttle < THROTTLE_MAX) { throttle++; } } else if (held & CONTROL_BACK) { if (throttle > THROTTLE_MIN) { throttle--; } } llMessageLinked(LINK_SET,throttle,"throttle",""); // pass throttle setting to child prims } if ((held & CONTROL_RIGHT) || (held & CONTROL_ROT_RIGHT)) { if (angMotor.z > 0) { angMotor.z = 0; } else if (angMotor.z > -Z_ANG_MAX) { angMotor.z -= Z_ANG_INCR; llSetLinkPrimitiveParamsFast(RDPHousingSB, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(RDPHousingPT, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(RDPPropSB, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(RDPPropPT, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,135.0>*DEG_TO_RAD)]); } } else if ((held & CONTROL_LEFT) || (held & CONTROL_ROT_LEFT)) { if (angMotor.z < 0) { angMotor.z = 0; } else if (angMotor.z < Z_ANG_MAX) { angMotor.z += Z_ANG_INCR; llSetLinkPrimitiveParamsFast(RDPHousingSB, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,-135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(RDPHousingPT, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,-135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(RDPPropSB, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,-135.0>*DEG_TO_RAD)]); llSetLinkPrimitiveParamsFast(RDPPropPT, [PRIM_ROT_LOCAL, llEuler2Rot(<0.0,0.0,-135.0>*DEG_TO_RAD)]); } } else { angMotor = ZERO_VECTOR; } I thought if I put in another set of llSetLinkPrimitiveParamsFast calls for each prim in the script with the Z rotation value set to 180, then I could get them to return to center. It seemed the best place would be after the 'else'. This does cause the engine prims to return to center, but then I lose the abiltiy to turn the boat left and right. I suspect I need something else under 'else' to keep the boat rotation from being blocked, but I'm out of ideas. As always, the community's help is greatly appreciated. Mig
  22. I am building a boat that has the driver position at the stern; the position of which makes it difficult to see directly in front of the bow. I was curious if there is a way to create a second camera position, and display the view from that camera on the surface of a simple prim that serves as a video monitor. The driver's camera position (view) would remain separate and set by the boat script. Can this be accomplished with scripting? If so, can anyone provide an example? As always, the help is most appreciated. Mig
×
×
  • Create New...