Controlling shading on coordinate-based geometry
creangle.wrl
#VRML V2.0 utf8
#
# creangle.wrl
# Crease Angle demonstration
# by John L. Moreland
#
WorldInfo {
title "Crease angle demonstration"
info [ "copyright (c) 1997, John L. Moreland" ]
}
Viewpoint {
description "Front Face"
position -2.0 0.85 3.0
orientation 0 1 0 -0.62
}
Viewpoint {
description "Back Face"
position 2.4 0.85 3.0
orientation 0 1 0 0.62
}
NavigationInfo {
type [ "EXAMINE", "ANY" ]
}
# Red Down Light
DirectionalLight {
color 1.0 0.0 0.0
direction 0.0 -1.0 0.1
}
# Blue Up Light
DirectionalLight {
color 0.0 0.0 1.0
direction 0.0 1.0 -0.1
}
# Panel 1
Transform {
translation -1.1 0.0 0.0
children [
Shape {
appearance DEF White Appearance {
material Material {
diffuseColor 1.0 1.0 1.0
ambientIntensity 0.5
}
}
geometry IndexedFaceSet {
coord DEF Crd1 Coordinate {
point [
# Front edge
0.0 0.0 1.0, # Bottom
0.0 1.0 1.0, # Middle
0.0 2.0 1.0, # Top
# Back edge
0.0 2.0 -1.0, # Top
0.0 1.0 -1.0, # Middle
0.0 0.0 -1.0, # Bottom
]
}
coordIndex [
0, 1, 4, 5, 0, -1,
1, 2, 3, 4, 1, -1,
]
creaseAngle 0.0
solid FALSE
}
}
Transform {
translation 0.0 1.0 1.2
children [
Billboard {
# axisOfRotation 0.0 0.0 0.0
children [
Shape {
appearance DEF FntColor Appearance {
material Material {
diffuseColor 1.0 0.0 0.0
}
}
geometry Text {
string "0.0"
fontStyle DEF FntStyle FontStyle {
style "BOLD"
size 0.1
justify [ "LEFT", "MIDDLE" ]
}
}
}
# Bend Angle Label
DEF bendAngleLabel Transform {
translation 0.0 -0.1 0.0
children [
Shape {
appearance Appearance {
material Material {
diffuseColor 0.0 0.5 0.0
}
}
geometry DEF bendAngle Text {
string "0.0"
fontStyle USE FntStyle
}
}
]
}
]
}
]
}
]
}
# Panel 2
Transform {
translation 0.0 0.0 0.0
children [
Shape {
appearance USE White
geometry IndexedFaceSet {
coord DEF Crd2 Coordinate {
point [
# Front edge
0.0 0.0 1.0, # Bottom
0.0 1.0 1.0, # Middle
0.0 2.0 1.0, # Top
# Back edge
0.0 2.0 -1.0, # Top
0.0 1.0 -1.0, # Middle
0.0 0.0 -1.0, # Bottom
]
}
coordIndex [
0, 1, 4, 5, 0, -1,
1, 2, 3, 4, 1, -1,
]
creaseAngle 0.785
solid FALSE
}
}
Transform {
translation 0.0 1.0 1.2
children [
Billboard {
# axisOfRotation 0.0 0.0 0.0
children [
Shape {
appearance USE FntColor
geometry Text {
string "0.785"
fontStyle USE FntStyle
}
}
USE bendAngleLabel
]
}
]
}
]
}
# Panel 3
Transform {
translation +1.1 0.0 0.0
children [
Shape {
appearance USE White
geometry IndexedFaceSet {
coord DEF Crd3 Coordinate {
point [
# Front edge
0.0 0.0 1.0, # Bottom
0.0 1.0 1.0, # Middle
0.0 2.0 1.0, # Top
# Back edge
0.0 2.0 -1.0, # Top
0.0 1.0 -1.0, # Middle
0.0 0.0 -1.0, # Bottom
]
}
coordIndex [
0, 1, 4, 5, 0, -1,
1, 2, 3, 4, 1, -1,
]
creaseAngle 1.57
solid FALSE
}
}
Transform {
translation 0.0 1.0 1.2
children [
Billboard {
# axisOfRotation 0.0 0.0 0.0
children [
Shape {
appearance USE FntColor
geometry Text {
string "1.57"
fontStyle USE FntStyle
}
}
USE bendAngleLabel
]
}
]
}
]
}
DEF PS PlaneSensor {
minPosition 0.0 0.0
maxPosition 6.283 1.57
}
DEF Scr Script {
eventIn SFVec3f set_translation
eventOut SFFloat fraction_changed
eventOut MFString label_changed
url "vrmlscript:
function set_translation( tran, et )
{
tempCA = tran[0] / 4.0;
if ( tempCA < 0.00 ) tempCA = 0.0;
if ( tempCA > 1.57 ) tempCA = 1.57;
fraction_changed = tempCA;
// Hacks to get truncation/formatting
tempCA = (Math.floor(tempCA*1000)/1000.0);
if ( (tempCA > 0.1) && (tempCA < 1.0) )
tempCA = '0' + tempCA;
if ( tempCA <= 0.0 )
tempCA = tempCA + '.' + '0';
label_changed[0] = tempCA;
}
"
}
DEF CI CoordinateInterpolator {
key [ 0.0, 1.57 ]
keyValue [
# Straight
# Front edge
0.0 0.0 1.0, # Bottom
0.0 1.0 1.0, # Middle
0.0 2.0 1.0, # Top
# Back edge
0.0 2.0 -1.0, # Top
0.0 1.0 -1.0, # Middle
0.0 0.0 -1.0, # Bottom
# Bent
# Front edge
0.0 0.0 1.0, # Bottom
0.0 1.0 1.0, # Middle
1.0 1.0 1.0, # Top
# Back edge
1.0 1.0 -1.0, # Top
0.0 1.0 -1.0, # Middle
0.0 0.0 -1.0, # Bottom
]
}
ROUTE PS.translation_changed TO Scr.set_translation
ROUTE Scr.fraction_changed TO CI.set_fraction
ROUTE Scr.label_changed TO bendAngle.set_string
ROUTE CI.value_changed TO Crd1.set_point
ROUTE CI.value_changed TO Crd2.set_point
ROUTE CI.value_changed TO Crd3.set_point