Japan Trip 2012 – Fox Canyon Photos and Videos

Hello family and friends! A few photos and videos of our trip so far–

Canyoning [Canyoneering] in Fox Canyon, Minakami, Japan.

Click photos for full-size version, click text links for videos…

This is about as tame as canyoneering gets…


Logan superman slides like an otter into a whitewater pool

Aya jumps into whitewater pool

Emi jumps

Logan and Emi hug in Fox canyon
She is one pretty lady, in a wetsuit or in a sun dress!

into a whitewater pool

Everyone still alive after superman slide

Aya jumps 6m into whitewater

Emi jumps 6m into whitewater

Logan jumps 6m into whitewater

Logan jumps backwards into canyon

Emi and Aya jump into a cool canyon pool

Aya musters her courage and plunges into whitewater

Emi drops backwards into swirling canyon pool

Logan forward flips into canyon pool

Mecha Construction in SL, Lesson 3

[11:51]  Jurgi Harlan: Welcome back
[11:51]  You: Sorry, I crashed most spectacularly
[11:51]  Jurgi Harlan: Sorry, hope it wasn’t the headlights display.
[11:52]  You: I have no idea what it was. Anyway, well done on the headlights. Are they toggleable?
[11:52]  Jurgi Harlan: Not as of yet.
[11:52]  Jurgi Harlan: I’m still looking for the right code to do it.
[11:52]  Jurgi Harlan: But we were going to discuss channel commands next, so I figured that was a good time to hammer that out.
[11:53]  Aestival Cohen is online
[11:53]  Jurgi Harlan: For now, I’m swapping in and out the mod and no-mod chassis.
[11:53]  lilone Sandgrain is online
[11:54]  Jurgi Harlan: But the particle stuff is fine instead, I am nothing if not patient.
[11:54]  You: Perhaps we can cover the primciples of both today.
[11:54]  You: *principles
[11:54]  Jurgi Harlan: That would be great
[11:55]  Jurgi Harlan: Setting up the lesson tools?
[11:56]  Gog Gremlin is online
[11:56]  Jurgi Harlan accepted your inventory offer.
[11:57]  You: Okie doke. The most crucial part of today’s lesson is to get a sense of the different ways that objects can communicate with each other.
[11:58]  Meditate Pillow: Jurgi Harlan, say ‘/1 Hide’ to hide me, or ‘/1 Show’ to make me show. Or just right-click and sit on me to use me.
[11:58]  Jurgi Harlan: Alright
[11:59]  Lars Bismark is offline
[11:59]  You: So, objects in SL have no awareness of each other unless we give them that awareness: letting them collide via the physics engine, having them sense each other, email each other, or chat with each other.
[12:00]  Jurgi Harlan: Alright.
[12:00]  You: Each method has benefits and drawbacks; for our purposes, chatting is the simplest and best suited for our needs.
[12:01]  You: it is almost completely non-secure, but it is quick and reliable enough. =)
[12:01]  Jurgi Harlan: Okay, that would be because it’s faster than email, and we have move flex-room in the signals made, as opposed to physics interactions, which we have to adapt to.
[12:01]  Jurgi Harlan: more flex-room*
[12:02]  Jurgi Harlan: And negative because near anything can chat, and interfere with smooth operation.
[12:02]  You: And sensing can be pretty hard on the server, depending on how it is implemented.
[12:02]  Jurgi Harlan: I’m not familiar with sensing, master. Is that the same system that the visitor counters use?
[12:03]  You: Right. Chat can be lossy especially when you’re flooding the chat buffer with lots of data, so if you’re communicating anything important between objects, it is important to verify.
[12:03]  You: Sensing gives the object “eyes” and allows it to passively gather information about the world around it without interacting.
[12:04]  Jurgi Harlan: Hm. Interesting. I hope that I will be taught that one day.
[12:04]  You: So for example, a popular application of sensors is to restrict the sensing to agents. Typically this shows up with avatar “radars”
[12:04]  Jurgi Harlan: /nods
[12:05]  Jurgi Harlan: Like the visitor counters and security systems.
[12:05]  You: Yes indeed
[12:05]  Jurgi Harlan: Alright. But we won’t be addressing that today…correct?
[12:06]  You: No, we can cover sensors another day when discussing how to make giant mecha avatars able to punt other avatars or step on them.
[12:06]  Jurgi Harlan: OOOH!
[12:06]  You: It is fun indeed.
[12:06]  Jurgi Harlan: I believe it@
[12:07]  You: Anyway, so our situation is as follows: we want to create an upper arm out of particlesthat go from the forearm to the shoulder or vice versa.
[12:08]  Jurgi Harlan: Yes, to create the illusion of a energy-based suspension system to hack the shoulder problem
[12:08]  You: But in order to do that, we need the key of each prim that will be “receiving” (i.e., will be the particle target) the particles.
[12:08]  Lars Bismark is online
[12:08]  Jurgi Harlan: The key of each prim…hm. I do not know how to find that.
[12:08]  You: The practical difficulty is that the key of each prim in an attachment is different every time you put on the avatar or teleport with it on
[12:09]  You: So, we need a robust system that dynamically updates its understanding of the necessary keys every time we teleport or rez.
[12:09]  Jurgi Harlan: Hmm…so hard coding there wouldn’t work. You’ll require variables, and commands to obtain the,
[12:09]  You: Luckily, that’s actually pretty easy.
[12:09]  Jurgi Harlan: them.*
[12:09]  You: Yes, that is a correct understanding.
[12:09]  Jurgi Harlan: Alright.
[12:10]  Failed to place object at specified location.  Please try again.
[12:10]  Jurgi Harlan: How do we go about setting up such a subsystem?
[12:11]  Jurgi Harlan: The shoulder code is locked and unreadable to me.
[12:11]  Jurgi Harlan: As is the forearm code.
[12:12]  You: First, we need to figure out how to get the shoulder and the elbow chatting with each other
[12:12]  Jurgi Harlan accepted your inventory offer.
[12:12]  Jurgi Harlan accepted your inventory offer.
[12:12]  You: Rez each of those near the other
[12:12]  You: Are they readable to you now?
[12:13]  Jurgi Harlan: Alright, thanks to my time at the particle lab, much of this is comprehensible to me
[12:13]  Jurgi Harlan: Yes, sensei.
[12:13]  Jurgi Harlan: Is this your documentation?
[12:14]  You: This particle script is an adaptation of the eminent Eltee Statosky, of Luskwood. Several other free and open particles scripts are out there, including by Jopsy Pendragon and Ama Omega
[12:14]  Memir Quinn is online
[12:15]  Jurgi Harlan: The documentation is well done…and the optional code is useful-looking.
[12:16]  You: This particle script is pretty well-documented, so we won’t spend much time on the particle variables except to say that it is quite well worth your time to simply play around and see what different effects are possible.
[12:16]  Jurgi Harlan: Yes. I will definately be tinkering with this framework later.
[12:16]  You: Today we’re more concerned with inter-script communication.
[12:16]  Jurgi Harlan: Alright
[12:17]  Jurgi Harlan: Is this a lesson building on what we learned from the bullet and the gun?
[12:17]  Fryer Klinger is offline
[12:18]  You: Actually, we will not be covering much of the same ground at all today. The bullet and gun had little in the way of any communication except for the idea of the start_parameter passed from gun to munition at the time of rez
[12:18]  Jurgi Harlan: Alright…I note the followTarget integer is True.
[12:18]  Jurgi Harlan: I would think the root of the work is being funnelled though that
[12:19]  You: Yes, that is a key detail. The entire point of the communication here is to keep that target key up to date
[12:19]  Jurgi Harlan: I see.
[12:20]  You: Scrolling down below the particle engine coding, about 80% of the way down, look for an “init() {” function
[12:20]  Jurgi Harlan: In the region of the Emissive Mask?
[12:20]  Jurgi Harlan: I note that the data requests here are all variables.
[12:21]  You: Further dow– the first line within it is a llListenRemove
[12:21]  Jurgi Harlan: yes, i see it
[12:21]  You: Good! This block of code sets up the listening functionality that is one-half of communication.
[12:22]  Jurgi Harlan: On channel 997?
[12:22]  You: First, we destroy the old listen with llListenRemove, then reestablish it with llListen.
[12:22]  Jurgi Harlan: Ah, so as to not allow conflicts.
[12:22]  You: Yes, it is on a nonzero channel to keep it from spamming us with its simple comm. protocol.
[12:23]  Jurgi Harlan: I see, much like an encoded wireless channel PAN in Shadowrun…
[12:23]  Jurgi Harlan: It’s working of it’s own “signal wavelength” unlikely to be duplicated.
[12:23]  You: Stritcly speaking, it is usually good practice to use a negative channel for chat communications that are strictly script-2-script, since avatars can not directly use negative chat channels.
[12:23]  Jurgi Harlan: After all, who chats in 997?
[12:24]  Jurgi Harlan: Negative channels…gotcha.
[12:24]  You: You are correct, though for clarity’s sake I should note that chatting on a nonzero channel does not at all encrypt the communication; anyone out there can code a simple listen-chat repeater listening on your channel if they know it.
[12:25]  You: However, we have something like four billion chat channels to choose from
[12:25]  You: Still, never ever EVER use chat for ANY communication that should be encrypted in any way.
[12:25]  Jurgi Harlan: I see.
[12:26]  You: But it is perfectly fine for simple tasks like this.
[12:26]  Jurgi Harlan: So not for, say, ATMs and vendors.
[12:26]  You: So, once we init() the script, it is waiting for updated key information distributed on the specified channel
[12:26]  Jessica Qin is offline
[12:27]  You: what do on_rez and state_entry do for us?
[12:27]  Jurgi Harlan: let’s see.
[12:28]  Jurgi Harlan: Reset script…so, on rezzing, the script cleans itself off and reboots.
[12:28]  You: yes, and doing so always triggers state_entry.
[12:29]  Butterfly Wishbringer is online
[12:29]  Jurgi Harlan: It creates a timer…five seconds long…
[12:30]  Jurgi Harlan: And creates a text entry that looks to just be one blank space…which is what the listen is looking for.
[12:30]  You: Well, in this case, the llSetText was used to simply clear out the hovering text over the prim containing the script.
[12:31]  Jurgi Harlan: Oh, alright.
[12:31]  You: Specifying an empty string erases the floating text. =) Next we have the listen() event handler. So, what happens when this script detects any chat on channel 997?
[12:32]  Lars Bismark is offline
[12:32]  Jurgi Harlan: Hm…
[12:32]  Jurgi Harlan: I’m not sure…but I think first, it’s checking to see if the message is blank.
[12:32]  Jurgi Harlan: If not, it’s proceeding
[12:33]  Butterfly Wishbringer is offline
[12:34]  Jurgi Harlan: And it should be then shipping the non-blank response to the Target variable…but I’m not seeing where that happens…
[12:34]  Aestival Cohen is offline
[12:34]  Jurgi Harlan: Wait, is it target=(key)message?
[12:34]  You: Bingo.
[12:35]  You: The other joint has just discovere its own key, and chatted that info to this script on channel 997. So, we cast that string chat data into key format, and assign it to target.
[12:35]  You: Then what?
[12:36]  Jurgi Harlan: So, we’re establishing, for wont of a better term, a wireless connection between the two, which is constantly(every 5 seconds), pinging each other to make sure the set still is aligned.
[12:36]  You: Yes.
[12:36]  Jurgi Harlan: Alright…
[12:37]  You: Then, once we’ve got the updated information, we reinitialize the particle stream with the updated target.
[12:37]  You: However, there are several porblems with this script.
[12:37]  You: *problems
[12:37]  Jurgi Harlan: is that running=true?
[12:37]  You: It is a functional script, but a very sloppy one.
[12:37]  Jurgi Harlan: Or setParticles?
[12:38]  You: SetParticles is necessary to update the particle system’s target; it isn’t enough to simply update the target variable. We must also reboot the particle engine.
[12:38]  You: Recall that I said the key we’re interested in changes each time we rez or teleport. Is that happening every five seconds>?
[12:39]  Jurgi Harlan: Unlikely.
[12:39]  Jurgi Harlan: You’d have to be pretty frenetic to need that much rechecking.
[12:40]  You: True! So perhaps it is wasteful of us to ask the server to go through this whole process twelve times a minute.
[12:40]  Jurgi Harlan: So, is there a trigger that responds to being rezzed?
[12:40]  Jurgi Harlan: With which we can replace that one?
[12:40]  You: on_rez fires every time we rez or teleport, so we can use that as our trigger to kick everything off.
[12:40]  Jurgi Harlan: Ah.
[12:41]  Jurgi Harlan: Since the system life of the stream is infinite, we shouldn’t need to check any more often than that.
[12:41]  You: So, I see two places where we’re being wasteful here. One, the timer doesn’t need to work once it has done its job. Second, the listen handler is no longer useful once we’ve updated the key post-rez
[12:42]  Jurgi Harlan: And resource wastefulness creates sim crashes during your mech wars.
[12:42]  You: ! I spoke too soon. I DID put in a llListenRemove
[12:43]  You: Yes, you are correct. There are lots of poorly coded scripts out there; we shall endeavor to have our work not counted among them. =)
[12:43]  You: SO, armed with the knowledge that llSetTimerEvent(0); will cancel the timer, where do we want to put it?
[12:45]  Jurgi Harlan: Hm.
[12:45]  Jurgi Harlan: Hm
[12:46]  Jurgi Harlan: After a successful run.
[12:46]  You: Yes indeedy!
[12:46]  Jurgi Harlan: Right after the listen remove
[12:46]  You: Perfect.
[12:47]  You: That way once it has completed its task, the script goes passive, waiting for the next rez or teleport
[12:47]  You: And is quite light on the server.
[12:47]  Jurgi Harlan: Yes…but with on rez, why do we need the five second delay?
[12:47]  You: By extension, we are then being good grid citizens.
[12:47]  You: Excellent question.
[12:47]  Jurgi Harlan: Lag?
[12:47]  You: Exactly.
[12:48]  You: We have no guarantee that the OTHER script involved in this communication will be ready as soon as this one is.
[12:48]  You: In my tests way back when, it could be a difference of as much as 3-4 seconds on a slow server.
[12:49]  You: So, we let the script be graceful by waiting for its partner before departing to the dance floor.
[12:49]  Jurgi Harlan: I see
[12:50]  You: Why would the timer event fire off a chat message on channel 999 instead of 997, the cnhannel this script listens on?
[12:50]  Jurgi Harlan: Hm…well, the two joints are listening on 997 and 996.
[12:51]  Jurgi Harlan: I didn’t notice a broadcast on 999
[12:51]  You: Hmm, perhaps I’m looking at a different version of the script. Whoops. Anyway, why use 2 different chat channels, 996 and 997?
[12:52]  Jurgi Harlan: So as not to create a code hiccup and having a joint targeting itself, listening to itself talk.
[12:52]  You: Excellent. This is just one of many ways to sort out communications cleanly.
[12:53]  Jurgi Harlan: Sensei, I apologize, but I have an upcoming appointment.
[12:53]  You: No problem, this is a good stopping point.
[12:53]  Jurgi Harlan: Listening to the Buddhist Lama Bhante Kusaldhamma elsewhere.
[12:54]  Jurgi Harlan: I agree, I have come to understand, and I thank you for another useful lesson

Mecha Construction in SL, Lesson 2

[16:49]  Jurgi Harlan: I have a copy of that tank behind you.
[16:49]  You: How do you like it?
[16:49]  Jurgi Harlan: I found it got stuck on walls very easily.
[16:49]  RacerX Gullwing is offline
[16:50]  Jurgi Harlan: Not as in wedged, so much as it drove up them and ended up balanced on it’s rear.
[16:50]  You: Sad! I had been working to make it as robust as possible. Oh wel..
[16:50]  Jurgi Harlan: Perhaps some manner of command to cause it to right itself when upended?
[16:51]  Kage Seraph ponders that. Yes, that’s easily doable.
[16:51]  You: Would you like to work on mecha a bit this evening?
[16:51]  Jurgi Harlan: perhaps keyed to a voice command.
[16:52]  Jurgi Harlan: Indeed I would, Kage. That is why I have come, to continue my lesson.
[16:52]  Jurgi Harlan: And to report what I have learned in study so far.
[16:52]  Dizzy Arnaz shouts: DADDDDDDDDDDDY
[16:52]  You: Please do; you had mentioned earlier that you know now how to do rotating gears and things?
[16:53]  Jurgi Harlan: Yes…I believe the code was TargetOmega or somesuch.
[16:53]  Jurgi Harlan: Let me consult my notes.
[16:55]  Jurgi Harlan: Alright…paper is unreliable.
[16:55]  Jurgi Harlan: I will henceforth keep my notes on virtual notecards.
[16:56]  Jurgi Harlan: But yes, I managed to take apart the gear and antenna, and do some study on the command.
[16:56]  Kage Seraph smiles. I have the LSL wiki on speed dial. It saves mucho mucho time.
[16:56]  Jurgi Harlan: Indeed, I have it on my desktop now
[16:57]  Jurgi Harlan: I also noted that with the command, your attachment stays fixed, it is a illusionary rotation.
[16:57]  You: What would you like to cover tonight? We’d discussed the underlying principles pretty fully last time we met. Perhaps a more hands-on experience tonight?
[16:58]  You: Yes, llTargetOmega is a wholly clientside phenomenon. Thus, though we both see rotation with it, the given angle at any moment may be different for each of us.
[16:58]  Jurgi Harlan: Well, we had grasped the mechanics of the prims side of the issue.
[16:58]  Jurgi Harlan: Can we talk about appearing and disappearing parts, like in the Aereopteryx?
[16:59]  You: Certainly!
[16:59]  You: Two functions are useful in this context, llSetAlpha and llSetLinkAlpha.
[17:00]  Jurgi Harlan: Alpha…so is this related to the alpha channel?
[17:01]  You: Yes indeed. Both functions take a proportion (0-1) of alpha/transparency, as well as a side of the prim that the operation will take place on.
[17:01]  Jurgi Harlan: Proportion…related to a percentage?
[17:02]  Wayfinder Wishbringer is offline
[17:02]  You: A proportion is a fraction expressed as a decimal between 0 and 1 inclusive, so 50% is the same as 0.5 (proportion)
[17:02]  Jurgi Harlan: /nod
[17:03]  Jurgi Harlan: I thought as much, please continue.
[17:03]  You: The LSL wiki also refers to proportions as sliders occasionally. Same thing.
[17:03]  Jurgi Harlan: Alright
[17:03]  Wayfinder Wishbringer is online
[17:04]  You: So, to set the first face of the prim I’m setting on to transparent, the function call looks like: llSetAlpha( 0, 0 );
[17:04]  You: To set it to opaque: llSetAlpha ( 1, 0 );
[17:04]  Jurgi Harlan: Alright, so the number measures opacity.
[17:04]  Jurgi Harlan: As opposed to transparency.
[17:05]  Ben Kerensky is online
[17:05]  You: You can also specify that the whole prim is affected: llSetAlpha( x, ALL_SIDES);
[17:05]  Jurgi Harlan: Good, that will speed things up, I suspect.
[17:05]  You: SetLinkAlpha is the same in all respects except that you also specify the linknumber of the prim you want to operate on.
[17:06]  You: So with a little extra work, one code block in one script can render an entire complex object trasparent, opaque, or somewhere in between.
[17:06]  Jurgi Harlan: There we go.
[17:06]  Jurgi Harlan: Let me try that.
[17:06]  You: But that requires a for loop.
[17:06]  Jurgi Harlan: Oh, wait, dinner, give me a moment
[17:08]  Jurgi Harlan: There we go
[17:09]  Cabbit Grasshopper is online
[17:09]  Jurgi Harlan: One complex object, like…a plane mode?
[17:10]  You: All that said, a central control script detects if the agent is flying or not, and if the results of that check are different than the last time, then the controller tells subscripts to toggle transparency in each prim
[17:10]  Jurgi Harlan: Alright, what’s the command to detect flying?
[17:10]  You: Alternately, the control script could do the toggling itself using SetLinkAlpha, though this approach is substantially slower
[17:11]  You: integer llGetAgentInfo(key id)
[17:11]  Jurgi Harlan: So, you could set the transform sequence to anything, voice commands, HUD buttons, flying state.
[17:12]  You: So for flying, that would look something like: if( llGetAgentInfo(llGetOwner()) & AGENT_FLYING)
[17:12]  You: yes, that is correct.
[17:13]  You: If it is slaved to a HUD command, you could add in some pretty terrific blastoff / transform / etc. effects.
[17:13]  Jurgi Harlan: What would be the downside of a HUD control system?
[17:13]  Dirty McLean is offline
[17:13]  You: having to code secure communications between the HUD object and the transforming object.
[17:14]  Jurgi Harlan: Okay.
[17:14]  You: The central issue is that SL doesn’t currently support direct object-2-object communication, so you have to do it through chat (error-prone and slow)
[17:14]  Jurgi Harlan: Yes, I’ve seen that with Blitzwing.
[17:14]  Forseti Svarog is online
[17:15]  Jurgi Harlan: While the size was not in good order, it has a lot of functions for me to master.
[17:15]  Second Life: Your vote was received.
[17:15]  You: Good! Don’t be afraid to pull it apart into simpler dissections; this cube I’m sitting on is a simplification of the cloaking system I’m building into that vehicle you saw.
[17:16]  Jurgi Harlan: Alright, can I show you some of the things I wanted to discuss on it with you?
[17:16]  You: Sure!
[17:17]  Jurgi Harlan: Alright, you’ve explained to me about the appearing and disappearing sections…
[17:17]  Object: Hello, Avatar!
[17:17]  Jurgi Harlan: We spoke in our first lesson of the natural limits of movement for a avatar’s joints.
[17:19]  Jurgi Harlan: Okay, is this a violation of those joint laws?
[17:19]  You: Not at all. You’re observing that the rotation on the feet, for example, is impossible for a real human?
[17:20]  Jurgi Harlan: Indeed
[17:20]  SirCori Everidge shouts: LOL!!!!!!!!!!!!!!!!!!!!!!!
[17:21]  You: Any joint we have access to can be rotated in any direction for thousands of degrees if need be. The issue with larger mecha is that the /joining/ of the bones to make joints cannot be violated.
[17:21]  Jurgi Harlan: Ah!
[17:21]  You: That is, my femur must always remain attached to the pelvis, regardless of the rotation of that ball and joint socket, I can never dislocate it.
[17:21]  Jurgi Harlan: What of this flipping my head upside down?
[17:21]  You: Excellent question.
[17:22]  Lydie LeMay: hey guys
[17:22]  Jurgi Harlan: Hello, Lydie.
[17:22]  You: The rotation is anything you set it to be, even outside the limits of human ability, but the ends of the bones must forever be attached to one another.
[17:22]  You: Hi, Lydie!
[17:23]  You: So, you can fold the head down into the chest, but you can’t pull it off the neck in any way.
[17:23]  Object: <0.00000, 0.00000, 0.00000, 1.00000>
[17:23]  Object: 0.785422
[17:23]  Object: <0.00000, 0.00000, 0.00000, 1.00000>
[17:23]  Object: 0.785422
[17:23]  Object: <0.00000, 0.00000, 0.00000, 1.00000>
[17:23]  Object: 0.785422
[17:23]  Object: <0.00000, 0.00000, 0.00000, 1.00000>
[17:23]  Object: 0.785422
[17:23]  Object: <0.00000, 0.00000, 0.00000, 1.00000>
[17:23]  Object: 0.785422
[17:23]  Object: <0.00000, 0.00000, 0.00000, 1.00000>
[17:23]  Object: 0.785422
[17:23]  Jurgi Harlan: I see.
[17:24]  You: Believe me, that restriction drives me crazy. Ha!
[17:24]  You: Oh well.
[17:24]  Jurgi Harlan: I’ve figured out sitting to some extent, by the way.
[17:25]  You: Sitting well is about the only thing that separates the oldbies from the newbies, in the end. 😉
[17:25]  Jurgi Harlan: Tertiarily, I wondered as to the viability of onboard weaponry.
[17:25]  Wisteria Frye shouts: but u are
[17:26]  Wisteria Frye shouts: dont put the hat on shaka gives you, its a penis
[17:26]  You: It is 100% viable. Sensor-based, prim-based, both, anything is fair game.
[17:26]  Kado Okame shouts: Hes reported now anyways
[17:26]  Wisteria Frye shouts: bwaaaauuuhhh
[17:26]  Jurgi Harlan: Okay, do you have any lessons you can teach me on weapon systems, both how to design them, and counteract them?
[17:27]  Jessica Qin is offline
[17:27]  You: I can certainly guide you in building them, but counteracting them is difficult, especially if you’re including counteracting weapons not designed by you.
[17:28]  You: Perhaps the best way to tackle weapon design would be through a basic example.
[17:28]  Jurgi Harlan: Alright.
[17:28]  You: What shall we make? A rocket? Gun? Minelayer?
[17:28]  Jurgi Harlan: How about a cannon for this avatar?
[17:28]  Jurgi Harlan: Something to match up to the tank turret.
[17:29]  You: As you wish.
[17:29]  Blitz-flyer v1.5 whispers: Type help for help.
[17:29]  You: The first task is to create the munition.
[17:29]  Jurgi Harlan: Alright.
[17:30]  You: For the scripting involved, the wiki’s example is most elegantly done. http://secondlife.com/badgeo/wakka.php?wakka=ExampleGun
[17:30]  You: it handles setting the damage level, and what the munition should do when it strikes (1)ground (2) an av and (3) a prim
[17:31]  Jurgi Harlan: Hm.
[17:31]  Jurgi Harlan: What about an avatar’s attached prims?
[17:31]  Jurgi Harlan: Like these wing assemblies? Or a mech?
[17:31]  You: As a realistic munition would react differently to each of these collisions, it is good to see each case handled separately.
[17:32]  You: The munition will only collision-detect on the av’s collision skeleton, which if I recall correctly is located at the agent’s position between the legs of giant mecha. For your current av, the size difference is vanishingly small in a firefight.
[17:33]  Jurgi Harlan: I see.
[17:33]  Jurgi Harlan: /nod
[17:33]  You: That is, I could shoot through your wingtip but still miss you completely.
[17:33]  Jurgi Harlan: But that’s a small margin of error compared to having to shoot the Aereopteryx in the crotch
[17:33]  You: The collision skeleton is simply a LL hack to simplify the number of prims for Havok to deal with in physics calculations.
[17:34]  You: Yes, exactly re: Archaeopteryx
[17:34]  Jurgi Harlan: Ah, and I’ve been using the dinosaur name…I feel a fool now.
[17:34]  Kage Seraph smiles again. That’s no problem!
[17:35]  You: In any case, let’s briefly walk through the contents of the bullet script in the wiki so we both know what we’re doing.
[17:35]  Jurgi Harlan: Alright, let me bring it up.
[17:35]  You: http://secondlife.com/badgeo/wakka.php?wakka=ExampleGun
[17:35]  You: second script there
[17:36]  Jurgi Harlan: By the way, I assume that the collision box is related to the agent?
[17:36]  JetBall Doorway – Black Team shouts: Black Team New Player!
[17:37]  You: Yes, that is the case.
[17:37]  Jurgi Harlan: I thought as much, as it is what we bump into things with, and alot of these gun designs mention push.
[17:38]  Wayfinder Wishbringer is offline
[17:38]  You: Yes, push is a much-abused design feature we should discuss eventually. Ha. So, in state_entry, what are we doing with the bullet?
[17:39]  Jurgi Harlan: Okay, the first command seems to indicate the object is summoned, rather than permanent.
[17:40]  You: Correct, temp_on_rez gives the bullet a limited lifespan in case it gets lost. Good! Continue!
[17:40]  Jurgi Harlan: Alright, give me a second…
[17:40]  You: (also, note that temp_on_rez still deletes the bullet after ~1 minute even in no-script areas where llDie would silently fail)
[17:42]  Jurgi Harlan: Alright.
[17:43]  Jurgi Harlan: Status Physics seems to indicate that the bullet will react to gravity, simulated air friction, etc, like a flexible prim.
[17:43]  Jurgi Harlan: Die_at_edge seems to lead me to believe that sim zonelines will destroy the projectile as well.
[17:45]  You: Yes, enabling physics allows the physics engine (and clientside guessing/smoothing) to move the bullet gracefully through the air, in contast to the jerky motion we’d get using nonphysical movement.
[17:45]  Jurgi Harlan: Alright…
[17:45]  Jurgi Harlan: And Die_at_edge?
[17:46]  You: Die_at_edge deletes the prim if it hits the edge of the continent, *instead of returning it to your inventory*. An important detail for automatic weapons.
[17:46]  Jurgi Harlan: Ah, so at the edge of the continent.
[17:46]  Jurgi Harlan: Is there an inherent property that would do so if it crossed onto another server?
[17:47]  You: Next, I’ll take us through on_rez, since you’ve likely not seen many of those functions yet.
[17:47]  Jurgi Harlan: I note the TimetoDie hack of it above there.
[17:47]  You: Not a native function, though you could have the bullet record its present sim at each time slice, then compare for any differences and die if so.
[17:47]  Jurgi Harlan: Ah, so it would take a loop.
[17:47]  Jurgi Harlan: Please, proceed.
[17:48]  You: start_param in an integer that is passed from the script rezzing this munition to the scripts in the bullet.
[17:48]  Jurgi Harlan: Alright.
[17:49]  Jurgi Harlan: I see what you meant by elegant code, it’s almost English.
[17:49]  You: So, you can use that to see if the bullet is rezzed directly from inventory, or from the gun. Useful for debugging (e.g., you can turn OFF the auto-die functions if you’re rezzing the bullet from inventory to modify it).
[17:50]  Jurgi Harlan: Yes, by //-ing it out?
[17:50]  You: The first line within says “if the start_param equals zero (or false), then we must have rezzed from inventory and therefore, exit this code block before setting the collision filter, etc.”
[17:51]  Jurgi Harlan: Alright. So only if code summons it will the branch operate…in theory.
[17:51]  You: yes, you can comment out code with “//” on a line by line basis, but scripts cannot comment themselves. Rather, you can program in returns like we see here to do essentially the same thing.
[17:51]  You: Yes, that is the case.
[17:52]  You: Next, the bullet is told to not pay attention to any collisions with its owner ( llCollisionFilter(“”, llGetOwner(), FALSE); )
[17:52]  Jurgi Harlan: /nod
[17:52]  Jurgi Harlan: So you can’t accidentally set it off as it leaves your agent-space.
[17:53]  You: Next, the damage parameter is set equal to whatever value the rezzing script passed in start_param, so users of this bullet can dynamically update how dangerous they want the bullet to be in combat sims.
[17:53]  Wayfinder Wishbringer is online
[17:53]  You: The next line is commented and pretty straightforward at that.
[17:53]  Jurgi Harlan: Okay, if I can interject?
[17:53]  You: Sure, Jurgi.
[17:54]  Jurgi Harlan: What degree of interaction with damage does SL inherently have?
[17:54]  Jurgi Harlan: And what is it really defined as?
[17:55]  You: Damage only applies in damage-enabled areas, of which there are relatively few. When your life, expressed as a percent, hits zero, you’re teleported “home”. That’s about the extent of damage handling in SL, aside from very basic regeneration between hi
[17:55]  You: *hits.
[17:55]  You: Thus, uost combat systems handle damage other ways.
[17:56]  Jurgi Harlan: So even outside of Darklife, or other RPGs, we actually possess HP?
[17:56]  nonnux White is online
[17:56]  Jurgi Harlan: Right now, sitting here, we have a damage pool that can be harmed?
[17:57]  You: No, not at this time because this parcel does not have damage enabled. Were that the case, you’d see a little red heart and the lofe percentage at the center top of your SL screen.
[17:57]  Jurgi Harlan: Alright.
[17:57]  You: visit Jessie or Rausch sometime and you’ll see quite readily.
[17:57]  Jurgi Harlan: I’ve never seen that, so I guess I’ve never been to a combat sim
[17:58]  Jurgi Harlan: But the damage system this bullet and gun interact with is a toggleable system inbedded in SL.
[17:58]  You: Yep!
[17:58]  Jurgi Harlan: Alright…go ahead.
[17:59]  You: Finally in on_rez, we set a timer to go off after the pecified interval. What’s the interval and what happens when it is up?
[18:00]  Jurgi Harlan: It’s defined before the constants, and has a value of 20.0
[18:00]  Wayfinder Wishbringer is offline
[18:01]  Jurgi Harlan: I interpret it to be that when the counter concludes, the bullet unsummons.
[18:01]  Jurgi Harlan: As for the interval, I do not know.
[18:01]  You: Twenty seconds, yes.
[18:01]  Jurgi Harlan: Ah, alright.
[18:01]  You: Correct on both counts.
[18:02]  You: Next, we have collision_start, which fires every time the bullet hits something. Sometimes it will fire multiple times for a single object if it hits it multiple times (e.g. on a ricochet).
[18:03]  Jurgi Harlan: Alright.
[18:03]  You: Within collision_start, we filter against whether or not the collision was with an av or anything other than an av (an by extension, land as well).
[18:03]  You: Where it says “// tricky stuff like proprietary damage goes here” you typically insert blood spatter particle code, successful hit sound code, etc.
[18:04]  Slade Onizuka is online
[18:04]  Jurgi Harlan: I see, your special effects and such.
[18:04]  You: Pretty much. Finally, the bullet also responds to striking bare ground, useful for sending up clod-of-mud particles and things like that.
[18:05]  Jurgi Harlan: Alright, I also notice the ||Die command there.
[18:05]  Jurgi Harlan: Does that auto-unsummon any object it’s imbedded in?
[18:05]  Jurgi Harlan: Or even destroy permanent prims?
[18:06]  You: Yes, as long as the event happens in script-enabled land. Otherwise it doesn’t fire and the bullet simply falls to the ground motionless.
[18:06]  You: Thus, recall we set temp_on_rez up there just in case that happens.
[18:06]  SamBivalent Spork is offline
[18:07]  Jurgi Harlan: Will ||Die work on a permanent prim, like a castle?
[18:07]  Jurgi Harlan: Or only on a summoned object?
[18:07]  You: If by permanent you mean non-physical, then yes. It will work on pretty much anything except attachments, I believe.
[18:08]  JetBall Doorway – Black Team shouts: Black Team New Player!
[18:08]  Jurgi Harlan: I mean non Temp_On_Rez
[18:08]  You: Yes, it will also work in that case.
[18:08]  Jurgi Harlan: Alrighty.
[18:08]  Jurgi Harlan: Please continue.
[18:09]  You: As a final note on that, be careful in triggering llDie; it is an easy way to lose the latest updates you’ve made to the script calling it. Haha! Let’s have brief remark on bullet design.
[18:09]  Jurgi Harlan: Alright.
[18:09]  JetBall Doorway – Black Team shouts: Black Team New Player!
[18:10]  JetBall Doorway – Black Team shouts: Black Team New Player!
[18:10]  You: The bigger the bullet, the bigger kinetic energy it has when rezzed at speed. The same KE is applied to the rezzing prim when it rezzes. Recall Newton’s Laws of Motion here.
[18:10]  Raiden Karuna is online
[18:11]  You: Thus, guns with large bullets push the wearer with a force that counteracts the rezzing force.
[18:11]  Jurgi Harlan: A more massive object moving at the same speed has more power than a lighter one.
[18:11]  LiquiDiamond Frost is offline
[18:11]  You: Yes, and every action has an equal and opposite reaction, so the gun ‘pushing’ the bullet forward also ‘pushes’ you backward.
[18:11]  Raistlin Otis is online
[18:12]  Jurgi Harlan: I see.
[18:12]  You: (Because you are physics-enabled).
[18:12]  Jurgi Harlan: But our collision detection is also off…
[18:12]  Memir Quinn is online
[18:12]  You: For small bullets, this force is insufficient to overcome your inertia so folks don’t worry about scripting around it.
[18:13]  Jurgi Harlan: And my tank mode being pushed back a little would be more realistic anyway…
[18:13]  You: True, collision detection is off, but the bullet generally only collides with the firer on a ricochet.
[18:13]  You: (most gun scripts rez the bullet perhaps a meter away from the firer).
[18:13]  Jurgi Harlan: I see, so our physics are still interacting, I’m just circumventing triggering impact code.
[18:13]  You: Yes, that is the case.
[18:13]  Jurgi Harlan: I see.
[18:14]  You: Let’s transition to the gun script. This one is a bit longer, but still well-factored and -written. Browse through it and let’s tackle any questions you have about it.
[18:15]  Jurgi Harlan: Alright.
[18:16]  Jurgi Harlan: First we have variables being defined…
[18:16]  Jurgi Harlan: Some of them being loaded already.
[18:16]  Ben Kerensky is offline
[18:16]  Paul Linden: Some Regions will be going offline in 15 minutes to resolve a stability issue.  Effected Regions should be up whithin 30 minutes.
[18:16]  Jurgi Harlan: I notice a branch being loaded with the Say(string message) thing there.
[18:17]  Jurgi Harlan: Let’s begin there/
[18:17]  You: Okay. the say( * ) function is a general-purpose user-defined global function, so it can be called from anywhere.
[18:18]  You: the branch that calls it supplies the string that becomes the message that is ownersaid.
[18:18]  Jurgi Harlan: Alright…I think I got that…in this case, what is the use of it?
[18:18]  Jurgi Harlan: Wait.
[18:19]  Jurgi Harlan: I think I get it.
[18:19]  Jurgi Harlan: It creates a “say” command to force the weilder to speak error codes and messages from the gun code, so he can get information from it.
[18:19]  Jurgi Harlan: Which are stored in the variable “message”
[18:20]  You: Yup! This is a function mainly used for debugging.
[18:20]  Jurgi Harlan: Alright!
[18:20]  Jurgi Harlan: I’m getting it…let’s keep going.
[18:20]  You: Press on forward, my good man!
[18:21]  Jurgi Harlan: Its then polling the wielder for permission to override his functions.
[18:21]  JetBall Doorway – Black Team shouts: Black Team New Player!
[18:21]  Cabbit Grasshopper is offline
[18:22]  Jurgi Harlan: To run animations, read his input, and stick to his hand.
[18:22]  You: Yes, the user must at least implicitly (by attaching it) grant the weapon permission to begin reacting to the user’s control inputs. In this case, the control input we want is the left mousebutton in mouselook, as we’ll soon see.
[18:22]  You: If the script was not required to gain permission, imagine the potential abuses…!
[18:22]  Jurgi Harlan: Could one map the gun trigger to another button?
[18:23]  You: Yes indeed.
[18:23]  Raistlin Otis is offline
[18:23]  You: to any of the movement keys or combinations thereof.
[18:23]  Jurgi Harlan: But not to, say, the letter F, or Number Lock?
[18:24]  You: Unfortunately no. We’ve been pleading for this since 2003. So far no good.
[18:24]  Jurgi Harlan: Alright, so movement keys and mouse buttons.
[18:24]  Jurgi Harlan: Managable.
[18:25]  Jurgi Harlan: Then it filechecks itself, making sure you also own the Bullet code and gunfire sound.
[18:25]  Jurgi Harlan: If not, it makes you tell yourself so.
[18:25]  Jurgi Harlan: A smart piece of code there.
[18:25]  Jurgi Harlan: Never would have thought of that back in college.
[18:25]  Chase Speculaas is offline
[18:26]  You: Yes, sort of. It’s checking to see if those items are in the gun objects inventory. If not, the gun cannot rez the bullet or trigger the sound as the case may be.
[18:26]  You: *object’s
[18:26]  You: The assumption is that if you don’t own it with sufficient rights, especially copy rights, you won’t usefully be able to put it into the gun’s inventory.
[18:27]  You: Next we have arm and disarm. Go on, you’re doing very well!
[18:27]  IM: The Sojourner: Please join us in a gathering/dance tomorrow night (Thurs) from 5-7:30 pm at Dreams.  It is casual (low prim) to say thank you ALL!
[18:28]  Raistlin Otis is online
[18:28]  Jurgi Harlan: Alright, it consults the permissions it’s been given, then hijacks your left mouse button, but only in mouselook, and runs the animation of you raising the gun into a ready position.
[18:29]  You: Perfect.
[18:29]  You: And if it doesn’t have the permissions, it tries to get them again, just in case.
[18:29]  Jurgi Harlan: Ah, I didn’t notice that.
[18:29]  Jurgi Harlan: Yes, I see it leaping back to that branch there.
[18:30]  Jurgi Harlan: Also, it toggles on the Armed variable.
[18:30]  Jurgi Harlan: What’s that do?
[18:31]  Jurgi Harlan: I’m sorry. Is my ADD acting up or do I hear GIR?
[18:31]  You: that surfaces again in the attach() branch.
[18:31]  Kage Seraph unmutes SL
[18:31]  You: A high-pitched voice?
[18:32]  Jurgi Harlan: yes, GIR, from Invader Zim.
[18:32]  You: Your ADD appears to remain under control. =D
[18:32]  Jurgi Harlan: Distracting.
[18:33]  You: Anyway, gArmed is used to indicate what the gun script should do when the gun is detached. If it was armed (gArmed = TRUE), then the disarm function is called.
[18:33]  Jurgi Harlan: Okay, anyway.
[18:33]  You: but we haven’t got there yet. Ha!
[18:33]  Jim Herbst is online
[18:34]  You: disarm simply tidies up permissions, releases controls, and lets the user have his or her av back in full functionality.
[18:35]  You: Let’s jump down to touch_start(integer count)
[18:35]  Jurgi Harlan: Okay.
[18:35]  You: hint: “!=” reads aloud, “does not equal”
[18:35]  Jurgi Harlan: I had interpreted that…
[18:36]  You: and llDetectedKey(0) supplies the key of whoever just touched the object (clicked on it, not collided)
[18:36]  Jurgi Harlan: Yes.
[18:36]  Jurgi Harlan: So it’s checking if the wielder is the owner there.
[18:37]  You: Yup! What else is happening there?
[18:37]  Jurgi Harlan: One second.
[18:37]  Jurgi Harlan shouts: Whoever has the GIR sounds, send them to me so I can mute this in peace? kthnx
[18:37]  Jurgi Harlan: Alright.
[18:37]  Chase Speculaas is online
[18:37]  Jurgi Harlan: I’m a Invader Zim fan.
[18:37]  Jurgi Harlan: Now then…
[18:38]  Jurgi Harlan: Else if Get attached…I am in the neighborhood, but I can’t find the exact meaning there.
[18:38]  Slade Onizuka is offline
[18:39]  You: else if I am not attached, then run the getperms branch, which does three things including attaching the gun to the avatar
[18:39]  Jurgi Harlan: Okay, so it checked to see if it’s already in hand.
[18:39]  You: Correct, go on.
[18:39]  Jurgi Harlan: If not, it asks for permissions.
[18:40]  You: (and when it gets them it attaches, yes)
[18:40]  Jurgi Harlan: Then…it checks to see if the Armed setting is on…
[18:41]  Avery Habsburg: rofl u can transform?
[18:41]  Jurgi Harlan: If so, it disarms, if not, it arms.
[18:41]  Jurgi Harlan: And yes, Avery, I can.
[18:41]  You: Right on target. Yes.
[18:41]  Jurgi Harlan: Are you the one with the GIR noises?
[18:41]  Avery Habsburg: can u show me?
[18:41]  Avery Habsburg: no?
[18:41]  Jurgi Harlan: One sec, Kage, let me get this out of the way.
[18:42]  Avery Habsburg: where did u get that?
[18:42]  Jurgi Harlan: Okay, my get mode is screwed up
[18:42]  Avery Habsburg: rofl lmao
[18:42]  Jurgi Harlan: yagni’s pyramid

Mecha Construction in SL, Lesson 1

[11:54]  Jurgi Harlan: kage, I came to Second Life to design, pilot and sell mecha.
[11:54]  The Sojourner: Hi Xanshin
[11:54]  Jurgi Harlan: I believe you are my superior in this, and I wish to learn from you.
[11:55]  Xanshin Paz: hiya,
[11:55]  Xanshin Paz: Soj1
[11:55]  Xanshin Paz: jeez…..keybd impaired again
[11:55]  Xanshin Paz: hi guys!
[11:55]  You: I’d be happy to help you learn everything I know about mecha design. WHen would you like to begin?
[11:55]  Jurgi Harlan: At your convenience, I am a complete novice.
[11:55]  You: Hello, Xanshin
[11:56]  Jurgi Harlan: I am offering myself as apprentice, and intern.
[11:56]  Xanshin Paz: hello, Kage!
[11:56]  You: Well, if you have an hour or so, we could start right now, Jurgi.
[11:56]  Jurgi Harlan: I do.
[11:56]  The Sojourner: I will sit on the fence and write notecards
[11:57]  Jurgi Harlan: There, that got rid of the fur.
[11:57]  You: Great! Let’s have a seat and get a sense of what you already know.
[11:57]  Jurgi Harlan: Alright.
[11:57]  The Sojourner: Kage and I are good sitters
[11:58]  Jurgi Harlan: Apparently, I am not!
[11:58]  Kage Seraph dreams of the day when LL makes sitting a painless process.
[11:58]  Jurgi Harlan: Bah
[11:59]  Xanshin Paz: I’d pay to be a fly on this wall, but I’ve *got* to get some sleep :/
[11:59]  Jurgi Harlan: Nonetheless, what I know thusfar is slim.
[11:59]  Xanshin Paz: nice meeting you, guys
[11:59]  You: We can notecard the chat transcript, Xanshin, if everyone consents..?
[11:59]  Jurgi Harlan: I can show you my work, and it will say more than I can.
[11:59]  Xanshin Paz: oh, that’d be great !
[11:59]  Xanshin Paz: thanks!
[11:59]  Kage Seraph nods, no problem
[12:00]  Jurgi Harlan: These are the starting point of an idea I had…
[12:00]  Xanshin Paz: ‘nite, all……!
[12:00]  You: Night!
[12:00]  DragonChiq Thereian is online
[12:00]  Jurgi Harlan: You might not notice, but it is actually sized for your DIY kit.
[12:01]  Misty Rhodes is online
[12:01]  You: Intended as an attachment to the hips?
[12:01]  Jurgi Harlan: A pelvis attach…though eventually I planned to add actual moving treads.
[12:02]  Jurgi Harlan: This was my first attempt, disassembled for you.
[12:02]  Kage Seraph ponders. Shooting for a Madcat?
[12:02]  Jurgi Harlan: Feel free to get a closer look, and yes, I was basing my idea on a reverse knee Clan mech like a Mad Cat or Vulture.
[12:03]  You: Sounds good so far.
[12:03]  Jurgi Harlan: At the time, I hadn’t learned rescaling the whole model, so you’ll notice they’re too large.
[12:04]  Jurgi Harlan: For the DIY kit anyway.
[12:04]  You: Perhaps we could begin the discussion with animations and how they work in SL. They’re kinda the key concept in mecha design
[12:04]  Jurgi Harlan: Indeed, I have made animations in Avimator. Is that useful?
[12:05]  You: Yes, that is an excellent start (though I use Poser, so I can’t walk you through difficulties in Avimator directly)
[12:05]  Jurgi Harlan: That is what I have learned of particle effects.
[12:06]  Jurgi Harlan: The fly/follow effect is sadly copied from someone else’s work.
[12:06]  Jurgi Harlan: My goal was to keep the particles in the ball.
[12:06]  You: Looks good as a start, Jurgi.
[12:07]  Jurgi Harlan: It also makes a useful hands-free light source, when it’s not chasing pretty girls.
[12:07]  Kage Seraph grins
[12:07]  Jurgi Harlan: Well, I have one more work piece to show you.
[12:07]  You: Okay, rez it at will. =D
[12:08]  Jurgi Harlan: This was based off your Steam Golem design.
[12:08]  Jessica Qin is offline
[12:08]  DragonChiq Thereian is offline
[12:08]  Jurgi Harlan: It’s not done, but I was more trying to get the techniques you used down more than to copy every facet.
[12:09]  Jurgi Harlan: I hope my imitation didn’t offend.
[12:09]  You: Sure, it looks like you have a good eye for the forms involved
[12:09]  You: No, I have no problem with practicing that way.
[12:10]  Jurgi Harlan: I really like your Steam Golem as it gives you size, as well as maintaining a posable head which which conversations stay fluid.
[12:10]  You: Well, let’s use the Steam Golem as a conversation piece. We’ll pull it apart to see how it works, then put it back together as a complete piece.
[12:11]  Jurgi Harlan: At your leisure, sensei.
[12:11]  You: I’ll transplant the functional bits out of the anim overrider so we can concentrate on functionality, not form at this stage
[12:12]  Object: Loading notecard ‘*Default Anims’…
[12:12]  Object: Finished reading notecard. (4215 bytes free)
[12:13]  Ned Nolan: hello
[12:13]  Jurgi Harlan: So the invisiprims are on the feet, and the mech legs are on your lower legs, yes?
[12:13]  Ned Nolan: hi Soj
[12:13]  Higbee Protagonist is online
[12:14]  The Sojourner: Hi Ned.. working on something
[12:14]  You: Okay, as you saw before I attached the wooden box anim overrider, the attachments on the legs don’t determine the position of the av above the ground. Only the anim overrider does that
[12:14]  Bob Bunderfeld is offline
[12:14]  Jurgi Harlan: yes, I learned that, hence I was sizing my treads to match the overrider’s height limit.
[12:14]  You: So the legs can be arbitrarily short or long, and only have to extend to the ground if you’re shooting for a sense of realism. 😉
[12:14]  Jurgi Harlan: The code involved is completely unknown to me.
[12:15]  Zekeen Phoenix is online
[12:15]  You: In this case, I’ve integrated the invisiprims covering the mesh avatar’s calves and feet right into the lower legs of the prim av
[12:15]  Jurgi Harlan: Okay, give me a second there.
[12:15]  You: clarification in terms: mesh av = the regular human av almost all of us use
[12:16]  You: in my case, the mesh av is the one in jeans and a tee shirt
[12:16]  Jurgi Harlan: Okay, so those invisiprims are built into the legs, not separate attaches.
[12:16]  Zekeen Phoenix is offline
[12:17]  You: yes, though they could be separate attaches if you preferred to build it that way. I try to minimize the number of attachments used for sanity’s sake when tuning the av’s movement
[12:17]  Jurgi Harlan: Learning the exact function of invisiprims is going to be a lesson I will require.
[12:17]  You: Certainlyh, let’s handle that now.
[12:17]  Jurgi Harlan: Please do.
[12:19]  You: invisiprims use special textures to obscure any texture behind them by canceling the texture out. Some textures contain an extra “color” (called an alpha channel)
[12:19]  You: that programs like SL can interpret as transparency.
[12:19]  Jurgi Harlan: Alright, by “behind them” you mean contained within the prim’s area?
[12:20]  You: within and/or behind, the effect is the same. All that matters is which texture is encountered first when you sort them by distance from the SL client’s camera
[12:21]  You: so for me, the SL client camera is over and behind my shoulder
[12:21]  Jurgi Harlan: Well, I notice that when the mech’s leg is behind the invisiprim, it is not being obscured.
[12:21]  You: Very astute.
[12:21]  Jurgi Harlan: How is the prim discerning betwixt your foot, and the mech’s knee?
[12:22]  Jurgi Harlan: I also notice -I- am being obscured by them.
[12:22]  You: SL is mercifully set up such that textures that do NOT contain an alpha channel are not obscured by textures that DO contain an alpha channel
[12:22]  Jurgi Harlan: And my staff is not.
[12:22]  You: so, for this application we have two kinds of textures, alpha textures and non-alpha textures
[12:22]  Jurgi Harlan: Alright…
[12:23]  You: alpha textures obscure (hide) each other, and non-alpha textures of course obscure both alpha and non-alpha textures behind them.
[12:23]  Jurgi Harlan: I see.
[12:23]  You: so, it follows that the rusty textures on the mecha’s legs are non-alpha, and the textures on you and me are alpha textures
[12:23]  Jurgi Harlan: How can we manipulate what possesses the alpha channel state, and what does not?
[12:24]  DragonChiq Thereian is online
[12:24]  You: alpha channels can be added to any image in an offline image editor such as Adobe Photoshop or GIMP
[12:24]  You: Numerous excellent tutorials are on the web to do this.
[12:25]  You: Also,
[12:25]  Jurgi Harlan: I will acquire them.
[12:26]  You: when we change the transparency in the object editing toolbox (“Texture” tab, “Transparency” box), SL forces the texture in question to have an alpha channel
[12:26]  Jurgi Harlan: Even if we reset it to 0%?
[12:27]  You: Setting it to zero removes the alpha channel from a texture that was originally non-alpha to begin with.
[12:27]  Jurgi Harlan: Ah, I see.
[12:27]  Jurgi Harlan: I believe I have a functioning grasp of the concept.
[12:27]  You: Good! Let’s move on to the next brain-bender.
[12:28]  You: As it turns out, you and I and Soj each have two representations here on the inworld grid
[12:28]  Jurgi Harlan: Our location and our avatar.
[12:28]  You: First, the avatar that we all know and love and can see
[12:29]  You: Second, as you mentioned, our position is analogous to the agent representing each of us
[12:29]  Jurgi Harlan: yes, agent, the term had escaped me.
[12:29]  Jurgi Harlan: It is the agent by which we “play”, seeing and moving.
[12:29]  Jurgi Harlan: The avatar becomes merely the visual placemarker for the agent.
[12:30]  You: Most of the time, the agent and avatar can be used interchangeably. But there are a few crucial differences.
[12:30]  You: Yes, you’ve nailed it.
[12:30]  Jurgi Harlan: I have studied some, sensei.
[12:30]  You: The camera and collision detection are tied to the agent, NOT the avatar, and it is this distinction that makes giant mecha in SL possible
[12:31]  You: i.e., if we use an animation to move the apparent location of the avatar (for giant mecha, we move it straight up, no?), the agent’s position does not change.
[12:31]  Jurgi Harlan: Indeed.
[12:32]  Jurgi Harlan: We continue to interact with terrain, despite being above the ground.
[12:32]  You: that is, it stays on the ground. So, where is my agent right now?
[12:32]  Jurgi Harlan: Because our agent is at ground level.
[12:32]  You: true true
[12:32]  Jurgi Harlan: I have a question.
[12:33]  You: So, all of that to say that as you construct animations and later prim models,always remember where the av is and where the agent is.
[12:33]  You: Yes?
[12:33]  Jurgi Harlan: If our agent is on the ground, how does the avatar look correctly when I focus my vision below me by bending over?
[12:33]  You: Losing track of the relative positions in agent and av leads to some pretty glaring animation issues. =)
[12:34]  Jurgi Harlan: Allow me to visualize my question.
[12:34]  Jurgi Harlan: Now, I am starting at Soj.
[12:34]  Jurgi Harlan: My agent is at ground level.
[12:35]  Jurgi Harlan: Why does my head tilt down?
[12:35]  The Sojourner: soj waves
[12:35]  Jessica Qin is online
[12:36]  You: This is one case where LL did excellent bookkeeping.
[12:37]  Jurgi Harlan: So their systems manage it inherently?
[12:38]  You: Recall that the avatar is not fully tied to the agent, so each of our clients can calculate the proper avatar articulation regardless of where the agent is, that is, the av’s position and orientation are handled relative to the agent, but the algorithms
[12:39]  You: that determine head facing and foot facing in particular, are handled separately. That way, your feet are properly angled onto the ground and you can look about naturally regardless of most animations( i.e., animations that do not take over the head)
[12:39]  Jurgi Harlan: I see.
[12:39]  You: Other questions before we move on to articulation?
[12:40]  Jurgi Harlan: So this is not an issue we must constantly correct when building a mech with a poseable head.
[12:40]  You: that is correct. LL has done a good job formalizing how an unconstrained head should act. =)
[12:40]  Jurgi Harlan: I think I have a grasp of it, sensei, please move along if you are ready.
[12:41]  You: Okay, on to articulation.
[12:42]  You: The root of the magic in the animation here is to set the hips in the animation upward into the air as appropriate. The position and overall orientation of the avatar are determined thus:
[12:42]  You: get the position and rotation of the agent, add the effect of the active animation(s) to that, then display
[12:43]  You: As you know one can have multiple animations playing simultaneously, as when we are standing and typing at once
[12:43]  Lazarus Bogan is offline
[12:43]  Jurgi Harlan: Yes.
[12:44]  You: So, SL combines the animations mathematically and drops any subset of the animations that are of a lower priority that the highest-priority animation, as well as non-animated bodyparts.
[12:44]  You: another way to say that:
[12:44]  Jurgi Harlan: My staff overriding my left hand while I type, for example.
[12:45]  You: a priority 4 animation (the mecha standing animation) negates the default standing animation for all joints that the mecha animation takes control of
[12:45]  Jurgi Harlan: Ah, my slouching animation is a priority 4…can you teach me of the priorities?
[12:45]  You: Yes, your staff is a perfect example of that
[12:46]  The Sojourner: poor Kage looks like he has been riding a horse too long
[12:46]  You: Ha! Actually, Soj, that’s a pretty important detail we’ll get to soon
[12:47]  You: Priority for our needs with mecha are a sledgehammer kind of tool, that is, Mecha animations are totally “unnatural” to the normal SL av, so I typically set all the mecha animations to the highest priority to minimize overlap
[12:47]  Raistlin Otis is online
[12:48]  You: The notable exception to that is that I did not animate the mesh avatar’s head with the mecha animations, which is why the mesh head remains naturally articulated / animated even when I’m wearing this avatar.
[12:48]  Jurgi Harlan: Alright…at the same time, my priority 4 slump overrides my head movement.
[12:48]  Jurgi Harlan: How did you prevent the head override exactly?
[12:49]  You: Good question, and a key skill for animating capably
[12:50]  You: As it turns out, any animations we make only affect the joints for which we explicitly specify animations. So, in Poser or Avimator, we load up an SL mannequin and start manipulating, say, the left arm.
[12:50]  Forseti Svarog is online
[12:51]  You: If we upload that arm-waving animation without specifying any new movement for the other limbs, SL will continue to animate those other limbs normally while the arm animation plays or loops.
[12:51]  Jurgi Harlan: Does this cause a more natural blend, or more jerky chaos?
[12:51]  You: So, for this mecha set of animations, the arms, legs, and torso all have movements specified, but the head and neck do not.
[12:52]  You: Regarding jerkiness, much of that is dependent on (1) the character of the animation itself. Is it jerky? (2) the values specified in the transition-in and transition-out attributes when uploading the animation
[12:53]  You: those values determine how much weight the client gives to the early and late frames of the custom animation as it starts and ends.
[12:53]  You: basically analogous to a “fade in” and “fade out” effect
[12:54]  Jurgi Harlan: Transition-in and transition-out were very difficult for me, I mostly hotwired it until it ran for my slump.
[12:54]  Jurgi Harlan: I didn’t really have an understanding, just poked and prodded till it worked.
[12:55]  Jurgi Harlan: More training and examples would help…
[12:55]  Jurgi Harlan: But we can save it until appropriate…
[12:55]  The Sojourner is offline
[12:56]  You: Sounds good. Let’s finish up this discussion on articulation with a brief bit on joints of the mesh avatar and how we ‘hack’ them
[12:56]  Jurgi Harlan: So the goal when animating is to produce smooth movements that override as little as necessary to keep the body’s reactive coding intact.
[12:56]  You: Generally, yes. THat’s a good way to summarize it
[12:57]  Jurgi Harlan: Oh, yes, that’s a part I was definately curious about.
[12:57]  You: THough for mecha, we tend to have to take control of almost everything with the custom animations.
[12:57]  You: Soj noted earlier that I look like I’ve been riding a horse too long
[12:58]  Jurgi Harlan: Because of the wide hips.
[12:59]  You: That is an artifact of the fact that we cannot with custom animations break the joints of the av. That is, I cannot specify a shoulder joint position that is 5m, say, from the rest of the body. The joints, though they’re all raised into the air, have
[12:59]  You: to remain at normal human proportion to one another, except as far as we can push them with the normal appearance dials / sliders.
[13:00]  Jurgi Harlan: Yes.
[13:00]  You: So, since mecha are of course bigger than we are, all of the size-related sliders are maxed out for this mesh av to get the joints closer to where they should be for humanoid mecha.,
[13:01]  Jurgi Harlan: Yes, to keep the attachments moving as much like the body as we can.
[13:01]  Jurgi Harlan: The closer the body to the joints, the more natural the interplay.
[13:02]  You: But as you can see, the mecha’s knee joints are further out along the av’s y-axis (left-right). For legs, this isn’t much of a problem, since the hips and knees primarily function like hinges
[13:02]  Jurgi Harlan: For upper arms, you’ve substituted energy streams.
[13:02]  You: Since the prim legs are only slightly displaced, the effect is pretty good. Arms, however, are much trickier.
[13:03]  Jurgi Harlan: An inventive technique, in my opinion.
[13:04]  You: A last-ditch one. 😉 As you can imagine, the ball-and-socket joint and movement of the shoulder leads to crazy displacements as the animations play; the particle streams are one way around this problem
[13:04]  Jurgi Harlan: Yes, I couldn’t figure out how to make it work either…
[13:05]  Jurgi Harlan: I’ve been planning to save for a Decepticon or Gundam one to study their trick…
[13:05]  You: How much are they?
[13:06]  Jurgi Harlan: Though the code to make the streamers move from shoulder to elbow is another mystery to me.
[13:06]  You: I’ll walk you through that another day if you like.
[13:06]  Jurgi Harlan: I could take you to them…I don’t have prices memorized.
[13:06]  Jurgi Harlan: …um, wow.
[13:07]  Jurgi Harlan: Bring them with me when I come next time?
[13:07]  You: That should be enough to get you started on one or the other. Consider it a homework assignment to tear them apart and learn their techniques? Bring them if you wish
[13:07]  Jurgi Harlan: Will do sir!
[13:08]  Jurgi Harlan: I was also noting that the steam golem itself is moddable.
[13:08]  Jurgi Harlan: Though the demo version I have is not.
[13:08]  Lazarus Bogan is online
[13:08]  Jurgi Harlan: As I understood the sign.
[13:09]  Jurgi Harlan: And so you know, I am a buyer of your work.
[13:09]  You: Yes, that was intentional; the demo is simply a demo– if it were mod, folks would have no reason to get the full version. For those that did, I wanted them to be able to make it their own if they wished
[13:09]  Dirty McLean is offline
[13:09]  Jurgi Harlan: I have a question on this model however…
[13:09]  You: Yes?
[13:09]  Jurgi Harlan: if you would look at my left hip.
[13:10]  Jurgi Harlan: There is some loose tubing or handles or some such, free floating.
[13:10]  You: Ah, so I see. Carelessness in the gunship attachment on my part
[13:11]  Jurgi Harlan: Yours doesn’t have it.
[13:11]  Jurgi Harlan: Wait, there they are
[13:12]  Jurgi Harlan: After you transformed back to robot mode.
[13:12]  Jurgi Harlan: They’re there now.
[13:13]  Nomad Nighbor: COOL transformers convention 😀
[13:13]  Jurgi Harlan: Now they’re gone
[13:13]  You: Much better
[13:13]  You: Just had to fox 3 scripts
[13:13]  You: *fix
[13:13]  Jurgi Harlan: Alright…
[13:14]  Jurgi Harlan: Once they test clean, can I expect a copy?
[13:14]  Jurgi Harlan accepted your inventory offer.
[13:14]  You: I’ll update the vendor as well
[13:15]  Forseti Svarog is offline
[13:15]  Jurgi Harlan: Nice.
[13:15]  You: I think we’re at a good stopping point for today; Any last questions for the moment? Message me when we’re both online and we’ll continue
[13:15]  Jurgi Harlan: Only this.
[13:16]  Jurgi Harlan: May I use some of that Linden to purchase a Steam Golem to study?
[13:16]  Jurgi Harlan accepted your inventory offer.
[13:16]  You: Not much need for that. =)
[13:16]  Jurgi Harlan: THANK YOU!
[13:17]  Jurgi Harlan: I have been wanting this since I first laid eyes on it.
[13:17]  Jurgi Harlan: You have a thankful student.
[13:18]  You: Hey, no problem. Some folks learn best by pulling apart previous stuff and seeing what makes it tick.
[13:18]  You: That should be all moddable right down to the scripting
[13:18]  Jurgi Harlan: Thank you sensei, I will study well before our next meeting.
[13:18]  You: Open ‘er up and see what forms more questions for you. We’ll cover them when next we meet.
[13:18]  Jurgi Harlan: I will, and thank you again.
[13:19]  Kage Seraph nods.
[13:19]  Jurgi Harlan: I am off to purchase more mecha!
[13:19]  Jurgi Harlan: Farewell!
[13:19]  You: Have fun!