x3dom:7.跟随选中(并显示标签)

最新知识:

    <X3D>
              <Scene>
                <viewpoint onviewpointChanged="sync(event);"></viewpoint>
                <Transform>
                    <shape>
					......

其中该函数很重要onviewpointChanged="sync(event) ,当视角改变后,应该触发一些函数

 <script>
            var runtime = null;
        
            function init()
            {
                console.log("initialize");
                
                runtime = document.getElementsByTagName("x3d")[0].runtime;
                
                runtime.onAnimationStarted = function()
                {
                    console.log("Animation started");
                };
                
                runtime.onAnimationFinished = function()
                {
                    console.log("Animation finished");
                };
                
                updateRect();
            }
			
            function sync(event)
            {
                updateRect();
            }
            
            function updateRect()
            {
                var rect = runtime.getSceneBRect();
                var box = document.getElementById("box");
                box.style.left = rect.x + "px";
                box.style.top = rect.y + "px";
                box.style.width = rect.width + "px";
                box.style.height = rect.height + "px";
            }
        </script>

在这里插入图片描述

参考网页:
https://www.x3dom.org/x3dom/example/x3dom_uiEvents.html
在这里插入图片描述

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv='Content-Type' content='text/html;charset=utf-8'></meta>
    <meta http-equiv="X-UA-Compatible" content="chrome=1,IE=edge"></meta>
    <link rel="stylesheet" type="text/css" href="https://www.x3dom.org/release/x3dom.css" />
    <script type="text/javascript" src="https://www.x3dom.org/release/x3dom-full.js"></script>
  </head>
  
  <body style='background-color:#666;'>
  <x3d id="boxes" showStat="false" showLog="false" width="800px" height="500px">
      
    <scene DEF="scene">
       <viewpoint position="20.1 9.2 14.1" orientation="-0.36193 0.93169 -0.03096 1.06264"
        zNear="0.01" zFar="10000" id="aView"></viewpoint>
       <background groundAngle='0.9 1.5 1.57' groundColor='0.21 0.18 0.66 0.2 0.44 0.85 0.51 0.81 0.95 0.51 0.81 0.95' 
        skyAngle='0.9 1.5 1.57' skyColor='0.21 0.18 0.66 0.2 0.44 0.85 0.51 0.81 0.95 0.51 0.81 0.95' 
        groundTransparency='0.5 0.5 0.5 0.5' skyTransparency='0.5 0.5 0.5 0.5'></background>
        
        <Group onmousemove="updateStuff(event);">
          <Transform DEF="coneTrafo" translation="-4.5 0 0"
            onmouseover="document.getElementById('mouseOverEvent').innerHTML='cone.isOver=TRUE';"
            onmouseout="document.getElementById('mouseOverEvent').innerHTML='cone.isOver=FALSE';">
			<Shape DEF="coneShape">
				<Appearance DEF="coneApp">
					<Material DEF="coneMat" diffuseColor="0 1 0" specularColor=".5 .5 .5"></Material>
				</Appearance>
				<Cone DEF="cone"></Cone>
			</Shape>
		  </Transform>
		
		  <Transform DEF="boxTrafo" translation='-1.5 0 0'
            onmouseover="document.getElementById('mouseOverEvent').innerHTML='box.isOver=TRUE';"
            onmouseout="document.getElementById('mouseOverEvent').innerHTML='box.isOver=FALSE';">
			<Shape DEF="boxShape">
				<Appearance DEF="boxApp"> 
					<Material diffuseColor="1 0 1" specularColor=".5 .5 .5"></Material>
				</Appearance>
				<Box DEF="box"></Box>
			</Shape>
		  </Transform>
        
		  <Transform DEF="sphereTrafo" translation="1.5 0 0"
            onmouseover="document.getElementById('mouseOverEvent').innerHTML='sphere.isOver=TRUE';"
            onmouseout="document.getElementById('mouseOverEvent').innerHTML='sphere.isOver=FALSE';">
			<Shape DEF="sphereShape">
				<Appearance DEF="sphereApp">
					<Material diffuseColor="0 0 1" specularColor=".5 .5 .5"></Material>
				</Appearance>
				<Sphere DEF="sphere"></Sphere>
			</Shape>
		  </Transform>
		
		  <Transform id="blubb" DEF="cylinderTrafo" translation="4.5 0 0"
            onmouseover="document.getElementById('mouseOverEvent').innerHTML='cylinder.isOver=TRUE';"
            onmouseout="document.getElementById('mouseOverEvent').innerHTML='cylinder.isOver=FALSE';">
			<Shape DEF="cylinderShape">
				<Appearance DEF="cylinderApp">
					<Material id="blubbMat" diffuseColor="1 1 0" specularColor=".5 .5 .5"></Material>
				</Appearance>
				<Cylinder DEF="cylinder" radius="1.0" height="2.0" bottom="true" top="true" side="true"></Cylinder>
			</Shape>
		  </Transform>
		  
		  <Transform id="ring" translation="7.0 0 0"
              onmouseover="document.getElementById('mouseOverEvent').innerHTML='torus.isOver=TRUE';"
              onmouseout="document.getElementById('mouseOverEvent').innerHTML='torus.isOver=FALSE';">
  			<Shape DEF="cylinderShape">
  				<Appearance DEF="ringApp">
  					<Material diffuseColor="0 1 1" specularColor=".5 .5 .5"></Material>
  				</Appearance>
  				<Torus DEF="torus" innerRadius="0.25" outerRadius="0.75" subdivision="32 32"></Torus>
  			</Shape>
  		  </Transform>
        </Group>
        
        <Transform id="box_2_id" DEF="box_2">
          <Transform translation='-11 0 0' id="box_2_2_id"
            "document.getElementById('mouseOverEvent').innerHTML='Mouse: over - draggable';"
             "document.getElementById('mouseOverEvent').innerHTML='Mouse: out';">
            <Shape>
              <Appearance>
                <Material diffuseColor='1 0 0' specularColor='.5 .5 .5'></Material>	
              </Appearance>
              <Box size="4.5 4.5 4.5"></Box>
            </Shape>
          </Transform>
        </Transform>
        
        <Transform id="bar" translation="0 0 0">
          <Transform id="foo" scale=".1 .4 .1" translation="0 -0.4 0">
			<Shape isPickable="false" DEF="float">
				<Appearance>
					<Material diffuseColor="olivedrab" specularColor="peachpuff"></Material>
				</Appearance>
				<Cone></Cone>
			</Shape>
		  </Transform>
        </Transform>
    </scene>
    
  </x3d>

  <div style="clear: both; padding: 2px; color: #00ff00; background-color: black; width: 798px;">
      <p id="moveEvent" > ==&gt; Drag the red box around with your mouse! 
          Use left button for pane and right for zoom. </p>
      <p id="mouseOverEvent" > ==&gt; Move your mouse over the little primitives to update the markers. </p>
      <p id="viewMat" > &nbsp; </p>
  </div>
  <span id="anno2d" style="position: absolute; background-color: blue; color: yellow; border: yellow solid 1px; z-index: 10; padding: 6px; margin: 2px; width: 60px; height: 30 px; opacity: 0.7; text_align: center; top: 6px; left: 6px;">
        Annotation</span>
  
  <script>
    // the x3dom runtime object
    var runtime = null;
    var drag = false;


    // on button press
    function start(event) 
    {
        if (!drag) {
            document.getElementById('moveEvent').innerHTML = "Down: [" + event.layerX + " | " + event.layerY + "]";
            drag = true;
        }
    }

    // on mouse move
    function moveCallback(elem, trans)
    {
        document.getElementById('moveEvent').innerHTML = "Move " + elem.id + ": [" + trans + "]";
    }

    // on button release
    function stop(event)
    {
        if (drag) {
            document.getElementById('moveEvent').innerHTML = "Up: [" + event.layerX + " | " + event.layerY + "]";
            drag = false;
        }
    }
    
    // viewpoint changed
    function viewFunc(evt)
    {
        // show viewpoint values
        if (evt)
        {
        	var pos = evt.position;
        	var rot = evt.orientation;
    		var mat = evt.matrix;
		
            var camPos = pos.x.toFixed(4)+' '+pos.y.toFixed(4)+' '+pos.z.toFixed(4);
            var camRot = rot[0].x.toFixed(4)+' '+rot[0].y.toFixed(4)+' '+rot[0].z.toFixed(4)+' '+rot[1].toFixed(4);
        
            document.getElementById("viewMat").innerHTML = "&ltViewpoint position='" + 
                                                            camPos + "' orientation='" + camRot + "'&gt";
        }
        
        // update 2d marker also if camera changes since projection is now wrong
        var trans = x3dom.fields.SFVec3f.parse(document.getElementById('bar').getAttribute("translation"));
	    var pos2d = runtime.calcPagePos(trans.x, trans.y, trans.z);
        var anno = document.getElementById("anno2d");
        
        anno.innerHTML = "(" + pos2d[0] + ", " + pos2d[1] + ")";
        anno.style.left = (pos2d[0]+1) + "px";
        anno.style.top = (pos2d[1]+1) + "px";
    }
    
    // update position and orientation of line according to picked position and surface direction
    function updateStuff(event)
    {
        var norm = new x3dom.fields.SFVec3f(event.normalX, event.normalY, event.normalZ);
        var qDir = x3dom.fields.Quaternion.rotateFromTo(new x3dom.fields.SFVec3f(0, -1, 0), norm);
        var rot = qDir.toAxisAngle();
        
        var t = document.getElementById('bar');
        t.setAttribute('rotation', rot[0].x+' '+rot[0].y+' '+rot[0].z+' '+rot[1]);
        t.setAttribute('translation', event.worldX+' '+event.worldY+' '+event.worldZ);
        
        var pos2d = runtime.calcPagePos(event.worldX, event.worldY, event.worldZ);
        var anno = document.getElementById("anno2d");
        
        anno.innerHTML = "(" + pos2d[0] + ", " + pos2d[1] + ")";
        anno.style.left = (pos2d[0]+1) + "px";
        anno.style.top = (pos2d[1]+1) + "px";
    }

    // some inits to attach listeners etc.
    document.onload = function() 
    {
        var boxes = document.getElementById("boxes");
        runtime = boxes.runtime;
        boxes.addEventListener('mouseup', stop, false);
        
        var redBox = document.getElementById("box_2_id");
        redBox.addEventListener('mousedown', start, false);

        // Moveable wrapper requires x3dom-full.js, its signature is:
        // x3dom.Moveable(x3domElement, transformNode, callback, snapToGridSize)
        new x3dom.Moveable(boxes, redBox, moveCallback, 0);
        
        document.getElementById('aView').addEventListener('viewpointChanged', viewFunc, false);
        viewFunc(null);
    }
  </script>
  </body>
</html>

猜你喜欢

转载自blog.csdn.net/weixin_42755384/article/details/88828350