three.js如何在加载obj后改变模型? 10C

three.js加载obj人物模型后,如何修改任务的身高、腰围之类的数据?

1个回答

u010425776
凌澜星空 关键是加载obj模型之后如何修改模型的尺寸?比如长宽高啥的
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何在three.js中实现多个外部加载OBJ模型的逐一显示
求助!如何在three.js中实现多个外部加载OBJ模型的逐一显示,即在列表中选中名称显示对应的模型,其余的不显示。本人自学的,实在无法解决,特来求助!我想要的效果如图所示,即three.js官网中的一个例子。![图片说明](https://img-ask.csdn.net/upload/201703/13/1489405743_859037.jpg)http://carvisualizer.plus360degrees.com/threejs/
three.js 导入obj模型如何让模型更圆润?
使用three.js加载了一个obj模型,下图是3d软件导出的选项,只能用网格方式进行导出,用NURBS方式导出three.js没法识别。 ![图片说明](https://img-ask.csdn.net/upload/201903/01/1551421210_484285.jpg) 问题是three.js加载了这个网格方式导出的obj模型后显示出来的曲面块面化非常严重。如下图所示 ![图片说明](https://img-ask.csdn.net/upload/201903/01/1551421432_945963.jpg)![图片说明](https://img-ask.csdn.net/upload/201903/01/1551421523_509550.jpg) 我查了一天资料已经有方向了,应该是物体的法线问题。顶点法线,面法线,向量法线到底是哪个决定的我不太清楚。 threejs的材质中有一个flatShading属性本来应该是可以调整曲面光滑度的,但是现在是完全不起作用。 还听朋友说需要自己计算同坐标点法线平均值。 下图是顶点法线图 ![图片说明](https://img-ask.csdn.net/upload/201903/07/1551922286_219143.png)
Three.js无法加载obj文件,总是提示404错误,但是文件明明就在那啊??
![图片说明](https://img-ask.csdn.net/upload/201703/04/1488600190_525704.png)
three.js r71版本和r75版本obj模型加载问题
three.js以前一直用的是r71版本的后来发现更新到了75果断down下来放到了项目里。 但是发现不仅obj模型加载的方式并且在场景里的渲染效果也发生了变化。同样的render 71:![图片说明](https://img-ask.csdn.net/upload/201604/13/1460516935_269526.png) 75:![图片说明](https://img-ask.csdn.net/upload/201604/13/1460516955_580141.png)‘ 渲染效果发生了明显的变化。 查看了一下源码,未果。 本着求真的精神,求赐教。
利用three.js导入3d模型失败
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>lesson1-by-shawn.xie</title> <!--引入Three.js--> <script src="Three.js"></script> <script src="OBJLoader.js"></script> <script type="text/javascript"> //开启Three.js渲染器 var renderer;//声明全局变量(对象) function initThree() { var element = document.getElementById("canvas3d"); width = document.getElementById('canvas3d').clientWidth;//获取画布「canvas3d」的宽 height = document.getElementById('canvas3d').clientHeight;//获取画布「canvas3d」的高 renderer=new THREE.WebGLRenderer({antialias:true});//生成渲染器对象(属性:抗锯齿效果为设置有效) renderer.setSize(width, height );//指定渲染器的高宽(和画布框大小一致) document.getElementById('canvas3d').appendChild(renderer.domElement);//追加 【canvas】 元素到 【canvas3d】 元素中。 renderer.setClearColor(0x000000, 1.0);//设置canvas背景色(clearColor) } //设置相机 var camera; function initCamera() { camera = new THREE.PerspectiveCamera( 45, width / height , 1 , 500 );//设置透视投影的相机,默认情况下相机的上方向为Y轴,右方向为X轴,沿着Z轴朝里(视野角:fov 纵横比:aspect 相机离视体积最近的距离:near 相机离视体积最远的距离:far) camera.position.x = 50;//设置相机的位置坐标 camera.position.y = 10;//设置相机的位置坐标 camera.position.z = 25; camera.up.x = 0;//设置相机的上为「x」轴方向 camera.up.y = 0;//设置相机的上为「y」轴方向 camera.up.z = 1;//设置相机的上为「z」轴方向 camera.lookAt( {x:0, y:0, z:0 } );//设置视野的中心坐标 } //设置场景 var scene; function initScene() { scene = new THREE.Scene(); } //设置光源 var light; function initLight() { light = new THREE.DirectionalLight(0xff0000, 1.0, 0);//设置平行光源 light.position.set( 200, 200, 200 );//设置光源向量 scene.add(light);// 追加光源到场景 } //导入模型 var loader; function initObject(){ loader=new THREE.OBJLoader(); loader.load('male02.obj',function(object){ scene.add(object);}); } //执行 function threeStart() { initThree(); initCamera(); initScene(); initLight(); initObject(); renderer.clear(); renderer.render(scene, camera); } //threeStart(); </script> <style type="text/css"> div#canvas3d{ border: none; cursor: move; width: 1400px; height: 600px; background-color: #EEEEEE; } </style> </head> <body onload='threeStart();'> <!--盛放canvas的容器--> <div id="canvas3d"></div> </body> </html> 利用three.js导入obj模型,发现无法显示,请各位大神帮忙看下问题出在哪?利用chorme和firefox分别得到如下提示![图片说明](https://img-ask.csdn.net/upload/201709/20/1505914725_165217.png)![图片说明](https://img-ask.csdn.net/upload/201709/20/1505914742_786938.png)
webgl、three.js中网格模型变形问题
用webgl,three.js,怎样对STL或OBJ这些三角网格模型进行实时网格变形?
各位大神们,谁知道怎样通过three.js导入外部3d模型,然后可以拖动模型,并且模型的一部分不能被单独拖动,这个问题困扰我很多天,现在还是没办法解决,求助各位大神了,万分感谢!
各位大神们,我现在可以导入3d模型,并且这个模型可以拖动,但是一部分模型被单独拖动,其他模型不动,代码如下: ``` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>拖拽控件</title> <style> body { margin: 0; overflow: hidden; } #label { position: absolute; padding: 10px; background: rgba(255, 255, 255, 0.6); line-height: 1; border-radius: 5px; } </style> <script src="js/three.js"></script> <script src="js/jquery-1.9.1.js"></script> <script src="js/Detector.js"></script> <script src="js/TrackballControls.js"></script> <script src="js/dat.gui.min.js"></script> <script src="js/stats.min.js"></script> <script src="js/OBJLoader.js"></script> <script src="js/FBXLoader.js"></script> <script src="js/inflate.min.js"></script> <!--拖拽控件--> <script src="js/DragControls.js"></script> <!--可视化平移控件--> <script src="js/TransformControls.js"></script> </head> <body> <div id="WebGL-output"></div> <div id="Stats-output"></div> <div id="label"></div> <script> var objects=[]; var stats = initStats(); var scene, camera, renderer, controls, light, selectObject; // 场景 function initScene() { scene = new THREE.Scene(); } // 相机 function initCamera() { camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 10000); camera.position.set(0, 400, 600); camera.lookAt(new THREE.Vector3(0, 0, 0)); } // 渲染器 function initRenderer() { if (Detector.webgl) { renderer = new THREE.WebGLRenderer({antialias: true}); } else { renderer = new THREE.CanvasRenderer(); } renderer.setSize(window.innerWidth, window.innerHeight); renderer.setClearColor(0x050505); document.body.appendChild(renderer.domElement); } // 初始化模型 function initContent() { var helper = new THREE.GridHelper(1800, 50, 0x4A4A4A); helper.setColors(0x9370DB); scene.add(helper); var loader = new THREE.OBJLoader(); loader.load( "moder/obj/windmill.obj", function ( group ) { group.position.x=400; group.scale.set(20, 20, 20);//模型放大20倍 //group.scale.color(0x3CB37 group.name="groups" scene.add( group ); objects.push(group); } ); var loader = new THREE.OBJLoader(); loader.load( "moder/obj/low.obj", function ( group ) { group.position.x=-400; group.scale.set(20, 20, 20);//模型放大20倍 //group.scale.color(0x3CB37 group.name="groupss"; scene.add( group ); objects.push(group); } ); var loader = new THREE.FBXLoader(); //Samba Dancing idle_2 loader.load( 'moder/fbx/pipeline.fbx', function ( object ) { //console.log(object); object.scale.set(1,1,1); scene.add( object ); objects.push(object); mixers=object.mixer = new THREE.AnimationMixer( object ); var action = object.mixer.clipAction( object.animations[0]); action.play(); object.traverse( function ( child ) { if ( child.isMesh ) { child.castShadow = true; child.receiveShadow = true; } } ); console.log(object); } ); /*var cubeGeometry = new THREE.BoxGeometry(100, 100, 100); var cubeMaterial = new THREE.MeshLambertMaterial({color: 0x9370DB}); var cube = new THREE.Mesh(cubeGeometry, cubeMaterial); cube.position.x = -600; cube.position.y = 50; cube.name = "cubes"; scene.add(cube); var sphereGeometry = new THREE.SphereGeometry(50, 50, 50, 50); var sphereMaterial = new THREE.MeshLambertMaterial({color: 0x3CB371}); var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); sphere.position.x = 200; sphere.position.y = 50; sphere.name = "sphere"; // sphere.position.z = 200; scene.add(sphere); var cylinderGeometry = new THREE.CylinderGeometry(50, 50, 100, 100); var cylinderMaterial = new THREE.MeshLambertMaterial({color: 0xCD7054}); var cylinder = new THREE.Mesh(cylinderGeometry, cylinderMaterial); cylinder.position.x = -200; cylinder.position.y = 50; cylinder.name = "cylinder"; scene.add(cylinder);*/ } console.log(objects); // 鼠标双击触发的方法 function onMouseDblclick(event) { // 获取 raycaster 和所有模型相交的数组,其中的元素按照距离排序,越近的越靠前 var intersects = getIntersects(event); // 获取选中最近的 Mesh 对象 if (intersects.length != 0 && intersects[0].object ) { selectObject = intersects[0].object.parent; changeMaterial(selectObject); console.log(changeMaterial); } else { alert("未选中 Mesh!"); } } // 获取与射线相交的对象数组 function getIntersects(event) { event.preventDefault(); console.log("event.clientX:" + event.clientX) console.log("event.clientY:" + event.clientY) // 声明 raycaster 和 mouse 变量 var raycaster = new THREE.Raycaster(); var mouse = new THREE.Vector2(); // 通过鼠标点击位置,计算出 raycaster 所需点的位置,以屏幕为中心点,范围 -1 到 1 mouse.x = (event.clientX / window.innerWidth) * 2 - 1; mouse.y = -(event.clientY / window.innerHeight) * 2 + 1; //通过鼠标点击的位置(二维坐标)和当前相机的矩阵计算出射线位置 raycaster.setFromCamera(mouse, camera); // 获取与射线相交的对象数组,其中的元素按照距离排序,越近的越靠前 var intersects = raycaster.intersectObjects(scene.children); var intersects=intersects.parent; console.log(intersects); //返回选中的对象 return intersects; } // 窗口变动触发的方法 function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); } // 键盘按下触发的方法 function onKeyDown(event) { switch (event.keyCode) { case 13: initCamera(); initControls(); break; } } // 改变对象材质属性 function changeMaterial(object) { var material = new THREE.MeshLambertMaterial({ color: 0xffffff * Math.random(), transparent: object.material.transparent ? false : true, opacity: 0.8, }); object.material = material; } // 初始化轨迹球控件 function initControls() { controls = new THREE.TrackballControls(camera, renderer.domElement); // controls.noRotate = true; controls.noPan = true; // 视角最小距离 controls.minDistance = 1000; // 视角最远距离 controls.maxDistance = 5000; } // 添加拖拽控件 function initDragControls() { // 添加平移控件 var transformControls = new THREE.TransformControls(camera, renderer.domElement); scene.add(transformControls); // 过滤不是 Mesh 的物体,例如辅助网格 //var objects = []; /*for (let i = 0; i < scene.children.length; i++) { if (scene.children[i].isMesh) { objects.push(scene.children[i]); } //objects.push(object[i].parent); }*/ // 初始化拖拽控件 var dragControls = new THREE.DragControls(objects, camera, renderer.domElement); // 鼠标略过事件 dragControls.addEventListener('hoveron', function (event) { // 让变换控件对象和选中的对象绑定 transformControls.attach(event.object); }); // 开始拖拽 dragControls.addEventListener('dragstart', function (event) { controls.enabled = false; }); // 拖拽结束 dragControls.addEventListener('dragend', function (event) { controls.enabled = true; }); console.log(objects.length); } // 初始化灯光 function initLight() { light = new THREE.SpotLight(0xffffff); light.position.set(-300, 600, -400); light.castShadow = true; scene.add(light); scene.add(new THREE.AmbientLight(0x5C5C5C)); } // 初始化 dat.GUI function initGui() { // 保存需要修改相关数据的对象 gui = new function () { } // 属性添加到控件 var guiControls = new dat.GUI(); } // 初始化性能插件 function initStats() { var stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; document.body.appendChild(stats.domElement); return stats; } // 更新div的位置 function renderDiv(object) { // 获取窗口的一半高度和宽度 let halfWidth = window.innerWidth / 2; let halfHeight = window.innerHeight / 2; // 逆转相机求出二维坐标 let vector = object.position.clone().project(camera); // 修改 div 的位置 $("#label").css({ left: vector.x * halfWidth + halfWidth, top: -vector.y * halfHeight + halfHeight - object.position.y }); // 显示模型信息 //$("#label").text("name:" + object.name); } // 更新控件 function update() { stats.update(); controls.update(); controls.handleResize(); //transformControls.update(); } // 初始化 function init() { initScene(); initCamera(); initRenderer(); initContent(); initLight(); initControls(); initGui(); initDragControls(); // addEventListener('dblclick', onMouseDblclick, false); addEventListener('resize', onWindowResize, false); addEventListener('keydown', onKeyDown, false); } function animate() { if (selectObject != undefined && selectObject != null) { renderDiv(selectObject); } requestAnimationFrame(animate); renderer.render(scene, camera); update(); } init(); animate(); </script> </body> </html> ``` 一部分模型被单独拖动的效果如下: ![图片说明](https://img-ask.csdn.net/upload/201911/04/1572863955_100421.png) 然后我再修改当鼠标略过事件: ![图片说明](https://img-ask.csdn.net/upload/201911/04/1572864098_336978.png) 整个模型可以一起被拖动,但是模型混乱:效果图如下: ![图片说明](https://img-ask.csdn.net/upload/201911/05/1572916540_633061.png) 希望路过的好心人帮帮忙,万分感谢!!!!!!
threejs导入的obj模型怎样把网格面转换为曲面?
使用three.js加载了一个obj模型,下图是3d软件导出的选项,只能用网格方式进行导出,用NURBS方式导出three.js没法识别。 ![图片说明](https://img-ask.csdn.net/upload/201903/01/1551421210_484285.jpg) 问题是three.js加载了这个网格方式导出的obj模型后显示出来的曲面块面化非常严重。如下图所示 ![图片说明](https://img-ask.csdn.net/upload/201903/01/1551421432_945963.jpg)![图片说明](https://img-ask.csdn.net/upload/201903/01/1551421523_509550.jpg) 我查了一天资料已经有方向了,应该是物体的法线问题。顶点法线,面法线,向量法线到底是哪个决定的我不太清楚。 threejs的材质中有一个flatShading属性本来应该是可以调整曲面光滑度的,但是现在是完全不起作用。 还听朋友说需要自己计算同坐标点法线平均值。 下图是顶点法线图 ![图片说明](https://img-ask.csdn.net/upload/201903/07/1551922286_219143.png)
threejs多面体贴图加纹理,貌似只改变了颜色,求大神指点!
``` // 鼠标点击 var outlineMesh; document.addEventListener("mousedown", onDocumentMouseDown, false); init(); animate(); function init() { scr(); objects(); lights(); addfloor(); others(); } // var scene = new THREE.Scene(); // create a camera, which defines where we're looking at. // var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); function lights() { var ambientLight = new THREE.AmbientLight(0xffffff, 0.3); scene.add(ambientLight); var pointLight = new THREE.PointLight(0xffffff, 0.1); // scene.add(pointLight); // var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); var pointLight = new THREE.PointLight(0xffffff, 1); // scene.add(pointLight); camera.add(pointLight); } function objects() { // loadcontainer(); addHospital() } function addHospital() { var hospital = createHospital() // hospital.position.y = 20 scene.add(hospital) } function createHospital() { var hospital = new THREE.Object3D() var frontMainCoords = [ [0, -20], [-30, 0], [0, 20], [30, 0], ] var frontMainShape = utils.makeShape(frontMainCoords) var frontMainGeometry = utils.makeExtrudeGeometry(frontMainShape, 20) var frontMainMaterial = new THREE.MeshPhongMaterial({ map: textures.window() }) // var phongmaterial = new THREE.MeshPhongMaterial({color: 0x677784, transparent: true, opacity: 0.85}); // var phongmes = new THREE.Mesh(frontMainMaterial, phongmaterial); frontMainMaterial.map.repeat.set(0.1, 0.04) var alldate = [] //楼层总列表 for(var i=0;i<6;i++){ /* var frontMain = new THREE.Mesh(frontMainGeometry, frontMainMaterial) hospital.add(frontMain) renderScene()*/ var obj = "sta"+i; alldate.push(obj) } var layerList1 = [] var layerList2 = [] for(var j=0;j<5;j++){ var onedata = new THREE.Mesh(frontMainGeometry, frontMainMaterial); // var onedata =createMesh(frontMainGeometry, "stone.jpg"); hospital.add(onedata); layerList1.push(onedata) } for(var j=5;j<alldate.length;j++){ // var onedata =createMesh(frontMainGeometry, "stone.jpg"); var onedata = new THREE.Mesh(frontMainGeometry, frontMainMaterial); hospital.add(onedata); layerList2.push(onedata) } function createMesh(geom, imageFile) { // var texture = var mat = new THREE.MeshPhongMaterial(); mat.normalMap = new THREE.TextureLoader().load("/seismis/js/3djs/assets/textures/general/" + imageFile); // mat.specular = new THREE.Color(0xffffff); mat.needsUpdate = true; mat.shininess = 10; var mesh = new THREE.Mesh(geom, mat); return mesh; } //中间立体图形 // var polyhedron1 = createMesh(cubeGeometry, "stone.jpg"); renderScene(); var step1 = 0; var step2 = 0; function renderScene() { step1 += 0.1; for(var i=0;i<layerList1.length;i++){ var frontMain = layerList1[i]; frontMain.position.x = 0 + ( (2+i) * (Math.cos(step1))); frontMain.position.y = 0+i*20 + ( 2 * Math.abs(Math.sin(step1))); frontMain.position.z = 0 + ( (2+i) * (Math.cos(step1))); } step2 += 0.1; for(var k=0;k<(layerList2.length);k++){ var frontMain = layerList2[k]; frontMain.position.x = 0 + ( (2+k+5) * (Math.cos(step2))); frontMain.position.y = 0+(k+5)*20 + ( 2 * Math.abs(Math.sin(step2))); frontMain.position.z = 0 + ( (2+k+5) * (Math.cos(step2))); } requestAnimationFrame(renderScene); renderer.render(scene, camera); } // call the render function var step = 0; initModel() function initModel() { //辅助工具 var helper = new THREE.AxisHelper(10); scene.add(helper); var cubeGeometry = new THREE.Geometry(); //创建立方体的顶点 var vertices = [ new THREE.Vector3(0, 0, 20), //v0 new THREE.Vector3(30, 0, 0), //v1 new THREE.Vector3(0, 0,-20), //v2 new THREE.Vector3(-30, 0, 0), //v3 new THREE.Vector3(-30,220,0), //v4 new THREE.Vector3(-22,220,10), //v5 new THREE.Vector3(22,220,10), //v6 new THREE.Vector3(30,220,0), //v7 new THREE.Vector3(22,220,-10), //v8 new THREE.Vector3(-22,220,-10), //v9 ]; cubeGeometry.vertices = vertices; //创建立方的面 var faces=[ new THREE.Face3(0,1,2), new THREE.Face3(0,2,3), new THREE.Face3(3,0,5), new THREE.Face3(3,5,4), new THREE.Face3(3,4,9), new THREE.Face3(3,9,2), new THREE.Face3(2,9,8), new THREE.Face3(8,1,2), new THREE.Face3(8,7,1), new THREE.Face3(6,1,7), new THREE.Face3(6,0,1), new THREE.Face3(0,6,5), new THREE.Face3(5,6,7), new THREE.Face3(5,7,8), new THREE.Face3(5,8,9), new THREE.Face3(5,9,4), ]; cubeGeometry.faces = faces; //生成法向量 cubeGeometry.computeFaceNormals(); function createMesh(geom, imageFile) { // var texture = var mat = new THREE.MeshPhongMaterial(); mat.map = new THREE.TextureLoader().load("/seismis/js/3djs/assets/textures/general/" + imageFile); // mat.specular = new THREE.Color(0xffffff); mat.needsUpdate = true; mat.shininess = 10; var mesh = new THREE.Mesh(geom, mat); return mesh; } //中间立体图形 // var polyhedron1 = createMesh(cubeGeometry, "stone.jpg"); // scene.add(polyhedron1); /* var frontMainMaterial = new THREE.MeshPhongMaterial({ map: textures.window() }) frontMainMaterial.map.repeat.set(0.01, 0.04)*/ var polyhedron1 = createMesh(cubeGeometry, "bathroom-normal.jpg"); polyhedron1.position.x = 0; polyhedron1.position.y = 120; polyhedron1.position.z = 0; scene.add(polyhedron1); /* var textureLoader = new THREE.TextureLoader(); textureLoader.load( "/seismis/js/3djs/assets/textures/general/bathroom-normal.jpg", function( texture ){ // 加载法向贴图 textureLoader.load("/seismis/js/3djs/assets/textures/general/bathroom-normal.jpg", function( normalTexture ){ var geometry = new THREE.BoxGeometry( 50, 50, 50 ); var material = new THREE.MeshBasicMaterial({ map: texture, normalMap: normalTexture // 只要将法向贴图赋给材质的normalMap属性即可 }); mesh = new THREE.Mesh( geometry, material ); scene.add( mesh ); } ); });*/ //12面体 /* var frontMainMaterial = new THREE.MeshPhongMaterial({ map: textures.window() }) var polyhedron2 = new THREE.Mesh(new THREE.IcosahedronGeometry(150, 0), frontMainMaterial); // var polyhedron2 = createMesh(new THREE.IcosahedronGeometry(50, 0), "stone.jpg"); polyhedron2.position.x = 112; scene.add(polyhedron2);*/ var cubeGeometry1 = new THREE.Geometry(); //创建立方体的顶点 var vertices = [ new THREE.Vector3(-30,0,0), //v4 0 new THREE.Vector3(-22,0,10), //v5 1 new THREE.Vector3(-22,0,-10), //v9 2 new THREE.Vector3(-30,35,0) //v10 3 ]; cubeGeometry1.vertices = vertices; //创建立方的面 var faces=[ new THREE.Face3(0,1,3), new THREE.Face3(3,2,0), new THREE.Face3(2,0,1), new THREE.Face3(1,2,3) ]; cubeGeometry1.faces = faces; //生成法向量 cubeGeometry1.computeFaceNormals(); var cubeMaterial = new THREE.MeshLambertMaterial({color: 0x6a5e74}); cube = new THREE.Mesh(cubeGeometry1, cubeMaterial); cube.position.x = 0; cube.position.y = 340; cube.position.z = 0; scene.add(cube); var cubeGeometry2 = new THREE.Geometry(); //创建立方体的顶点 var vertices = [ new THREE.Vector3(30,0,0), //v7 0 new THREE.Vector3(22,0,10), //v6 1 new THREE.Vector3(22,0,-10), //v8 2 new THREE.Vector3(30,35,0) //v11 3 ]; cubeGeometry2.vertices = vertices; //创建立方的面 var faces=[ new THREE.Face3(0,2,1), new THREE.Face3(2,1,3), new THREE.Face3(3,1,0), new THREE.Face3(3,0,2), ]; cubeGeometry2.faces = faces; //生成法向量 cubeGeometry1.computeFaceNormals(); var cubeMaterial = new THREE.MeshLambertMaterial({color: 0x6a5e74}); cube2 = new THREE.Mesh(cubeGeometry2, cubeMaterial); cube2.position.x = 0; cube2.position.y = 340; cube2.position.z = 0; scene.add(cube2); //顶部 var cubeGeometry3 = new THREE.Geometry(); //创建立方体的顶点 var vertices = [ new THREE.Vector3(-27,0,4), // 0 new THREE.Vector3(-27,0,-4), // 1 new THREE.Vector3(-30,11,0), // 2 new THREE.Vector3(30,11,0), // 3 new THREE.Vector3(27,0,4), // 4 new THREE.Vector3(27,0,-4), // 5 ]; cubeGeometry3.vertices = vertices; //创建立方的面 var faces=[ new THREE.Face3(0,2,1), new THREE.Face3(1,2,3), new THREE.Face3(1,3,5), new THREE.Face3(3,2,0), new THREE.Face3(3,0,4), new THREE.Face3(3,4,5), ]; cubeGeometry3.faces = faces; //生成法向量 cubeGeometry1.computeFaceNormals(); var cubeMaterial = new THREE.MeshLambertMaterial({color: 0x6a5e74}); cube2 = new THREE.Mesh(cubeGeometry3, cubeMaterial); cube2.position.x = 0; cube2.position.y = 364; cube2.position.z = 0; scene.add(cube2); } function render() { // stats.update(); polyhedron.rotation.y = step += 0.01; // render using requestAnimationFrame requestAnimationFrame(render); webGLRenderer.render(scene, camera); } return hospital } function createWindow() { var windowObj = new THREE.Object3D() var glassGeometry = new THREE.PlaneGeometry(20, 20) var glass = utils.makeMesh('phong', glassGeometry, 0x6a5e74) windowObj.add(glass) var windowBorderGeometry = new THREE.BoxBufferGeometry(22, 2, 2) var windowBorder = utils.makeMesh('phong', windowBorderGeometry, 0xffffff) var windowBorderTop = windowBorder.clone() windowBorderTop.position.y = 10 windowObj.add(windowBorderTop) var windowBorderBottom = windowBorder.clone() windowBorderBottom.position.y = -10 windowObj.add(windowBorderBottom) var windowBorderLeft = windowBorder.clone() windowBorderLeft.rotation.z = 0.5 * Math.PI windowBorderLeft.position.x = -10 windowObj.add(windowBorderLeft) var windowBorderRight = windowBorderLeft.clone() windowBorderRight.position.x = 10 windowObj.add(windowBorderRight) return windowObj } function loadcontainer() { var onProgress = function (xhr) { if (xhr.lengthComputable) { var percentComplete = xhr.loaded / xhr.total * 100; console.log(Math.round(percentComplete, 2) + '% downloaded'); } }; var onError = function (xhr) { }; var mtlLoader = new THREE.MTLLoader(); mtlLoader.load('/seismis/js/js/objs/5.mtl', function (materials) { materials.preload(); var loader = new THREE.OBJLoader(); loader.setMaterials(materials); loader.load('/seismis/js/js/objs/5.obj', function (object) { object.traverse(function (child) { if (child instanceof THREE.Mesh) { child.material.transparent = true; child.material.opacity = 1; if (child.material instanceof Array) { for (var i = 0, length = child.material.length; i < length; i++) child.material[i].transparent = true; } } }); // for (var i = 0; i < 3; i++) { var temp = object.clone(); // temp.position.set(-100 + 300 * i, 150, 0); temp.position.set(0 , 0, 0); scene.add(temp); // } }, onProgress, onError); }) } function loadmale1() { var onProgress = function (xhr) { if (xhr.lengthComputable) { var percentComplete = xhr.loaded / xhr.total * 100; console.log(Math.round(percentComplete, 2) + '% downloaded'); } }; var onError = function (xhr) { }; THREE.Loader.Handlers.add(/\.dds$/i, new THREE.DDSLoader()); var mtlLoader = new THREE.MTLLoader(); mtlLoader.setPath('/seismis/js/js/objs/male02/'); mtlLoader.load('male02.mtl', function (materials) { console.log(materials); materials.preload(); var objLoader = new THREE.OBJLoader(); objLoader.setMaterials(materials); objLoader.setPath('/seismis/js/js/objs/male02/'); objLoader.load('male02.obj', function (object) { object.position.y = 10; scene.add(object); }, onProgress, onError); }); } // 没有考虑group,所以通过obj加载的物体无法点选 function getMeshs() { var meshs = []; for (var i = 0, length = scene.children.length; i < length; i++) { if (scene.children[i] instanceof THREE.Mesh && scene.children[i].geometry instanceof THREE.BoxGeometry) { meshs.push(scene.children[i]); } } return meshs; } function onDocumentMouseDown(e) { e.preventDefault(); rotate = false; //将鼠标点击位置的屏幕坐标转成threejs中的标准坐标,具体解释见代码释义 var mouse = {}; mouse.x = (e.clientX / window.innerWidth) * 2 - 1; mouse.y = -(e.clientY / window.innerHeight) * 2 + 1; //新建一个三维单位向量 假设z方向就是0.5 //根据照相机,把这个向量转换到视点坐标系 var vector = new THREE.Vector3(mouse.x, mouse.y, 0.5).unproject(camera); console.log(vector); var sub = vector.sub(camera.position); console.log(sub); var param2 = sub.normalize(); var raycaster = new THREE.Raycaster(camera.position, param2); console.log("---------------------------------------------"); //射线和模型求交,选中一系列直线 var intersects = raycaster.intersectObjects(getMeshs()); if (intersects.length > 0) { //选中第一个射线相交的物体 scene.remove(outlineMesh); var SELECTED = intersects[0].object; var outlineMaterial2 = new THREE.MeshBasicMaterial({color: 0x00ff00, side: THREE.BackSide}); outlineMesh = new THREE.Mesh(SELECTED.geometry.clone(), outlineMaterial2); outlineMesh.position.set(SELECTED.position.x, SELECTED.position.y, SELECTED.position.z); outlineMesh.scale.multiplyScalar(1.05); scene.add(outlineMesh); } } ```
webgl 如何在网页上加载obj类型的三维模型,求通用源码
哪位大神可以帮帮小弟 给一份在网页上加载.obj类型的三维模型,之前有一些 但是加载的时候要么就是很大大到看不见,要么就是很小小到看不见 技术小白,万分感谢,好人一生平安!!
多线程如何确保obj.notify之前执行了obj.wait?
如果线程的wait比notify先执行,那么程序就死了,怎么才能解决这个问题? ``` public class AaaTest { public static void main(String[] args) throws InterruptedException { Object obj=new Object(); Ttt ttt=new Ttt(obj); ttt.start(); synchronized(obj){ obj.wait(); } System.out.println("wait先执行,程序通过"); } static class Ttt extends Thread{ Object obj; Ttt(Object obj){ this.obj=obj; } public void run() { synchronized(obj){ obj.notify(); } } } } ``` 这样是否能够100%保证 obj.wait(); 在 obj.notify(); 之前执行?
我试过输入THREE.REVISION,控制台会弹出版本的信息,但是我看里面的却是没有定义版本???
![图片说明](https://img-ask.csdn.net/upload/201908/06/1565054057_465289.png) ![图片说明](https://img-ask.csdn.net/upload/201908/06/1565054066_530835.png) ``` var scene = new THREE.Scene(); var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000); var renderer = new THREE.WebGLRenderer(); renderer.setClearColor(0xEEEEEE); renderer.setSize(window.innerWidth,window.innerHeight); document.body.appendChild(renderer.domElement); var ambientLight = new THREE.AmbientLight( 0xcccccc, 0.4 ); scene.add( ambientLight ); var pointLight = new THREE.PointLight( 0xffffff, 0.8 ); camera.add( pointLight ); scene.add( camera ); camera.position.z = 5; init(); function init(){ var onProgress = function ( xhr ) { if ( xhr.lengthComputable ) { var percentComplete = xhr.loaded / xhr.total * 100; console.log( Math.round( percentComplete, 2 ) + '% downloaded' ); } }; var onError = function () { }; new MTLLoader() .setPath( 'obj' ) .load( 'aaa.mtl', function ( materials ) { console.log(materials) materials.preload(); new OBJLoader() .setMaterials( materials ) .setPath( 'obj' ) .load( 'aaa.obj', function ( object ) { object.position.y = 0; scene.add( object ); }, onProgress, onError ); } ); } function render() { requestAnimationFrame(render); renderer.render(scene, camera); camera.lookAt( scene.position ); } render(); ```
3D模型obj文件转换json
D:\Program Files (x86)\Python\Python35-32>python "d:\Program Files (x86)\obj-convert-js\convert_obj_three.py" -i *.obj -o result.js File "d:\Program Files (x86)\obj-convert-js\convert_obj_three.py", line 815 print "WARNING: skipping morph [%s] with different number of vertices [%d] than the original model [%d]" % (name, n_morph_vertices, n_vertices) ^ SyntaxError: invalid syntax D:\Program Files (x86)\Python\Python35-32> 以上就是我的转换运行命令,一直转换不了,求大神解答!
obj.load.bind(obj),执行结果求解释
<script language="JavaScript" type="text/javascript"> Function.prototype.bind=function(object){ var _method=this; return function(){ _method.apply(object,arguments); } } function TestObj(){} TestObj.prototype.load=function(){alert("obj's load");} var newObj=new TestObj(); [color=red]newObj.load.bind(newObj); window.setInterval(newObj.load.bind(newObj),1000);[/color] </script> 本人是js菜鸟,对于上面代码,红色标记处执行结果不是很懂。求解、或提示。 newObj.load.bind(newObj);执行了load的bind方法,将object做了绑定,不会执行load方法。 window.setInterval(newObj.load.bind(newObj),1000);此句做循环时,为什么能循环执行load方法呢??load.bind只做了一次。
在C++程序里面使用TriMesh加载obj文件并显示此obj文件
在C++程序里面使用TriMesh加载obj文件并显示此obj文件
如何将igs,stp,xt格式的三维模型显示在web页面上
igs,stp,xt这些格式的三维模型保存在服务器上,我现在需要做到从服务器获取过来直接可以在web页面上显示预览模型,请问怎么做?查了three.js只能转obj等格式。如果bs架构做不到,用cs架构该用什么插件
Intel ISPC编译器生成的.h与.obj文件如何使用?
最近在利用ispc做加速的项目,我下载了ispc.exe(https://ispc.github.io/ispc.html),自己编写了一个.ispc文件,使用Windows 命令行的方式,利用ispc.exe将.ispc文件生成了一个.h与.obj文件,在我自己的项目中已经包含了生成的.h文件, 但是 还不清楚如何使用.obj文件,目前当我编译我的项目时,会显示无法解析的外部符号这样的问题,请问有没有人做过相关的项目,请教大家如何使用.h与.obj文件。
通过assimp给OpenGL加载模型为什么显示模型为全黑?
我是根据网站learnopengl.com上的模型载入部分来学的。根据示例应该显示一个纳米服战士的模型。但是实际上只有一个黑色的模型,什么纹理细节都没有,我换了一个蜘蛛的模型也不行。这是为什么啊?是不是贴图丢失了?代码都是网站作者写的,我复制过来,模型是OBJ格式,可以正常生成就是模型全黑为什么啊,是不是我assimp库配置还有问题?
将.max,.obj等格式转换为vtk格式
将.max或者.obj,.dae等格式的3d数据转换为.vtk格式的3d数据文件
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
python学习方法总结(内附python全套学习资料)
不要再问我python好不好学了 我之前做过半年少儿编程老师,一个小学四年级的小孩子都能在我的教学下独立完成python游戏,植物大战僵尸简单版,如果要肯花时间,接下来的网络开发也不是问题,人工智能也可以学个调包也没啥问题。。。。。所以python真的是想学就一定能学会的!!!! --------------------华丽的分割线-------------------------------- ...
兼职程序员一般可以从什么平台接私活?
这个问题我进行了系统性的总结,以下将进行言简意赅的说明和渠道提供,希望对各位小猿/小媛们有帮助~ 根据我们的经验,程序员兼职主要分为三种:兼职职位众包、项目整包和自由职业者驻场。 所谓的兼职职位众包,指的是需求方这边有自有工程师配合,只需要某个职位的工程师开发某个模块的项目。比如开发一个 app,后端接口有人开发,但是缺少 iOS 前端开发工程师,那么他们就会发布一个职位招聘前端,来配合公司一...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
JAVA 基础练习题
第一题 1.查看以下代码,并写出结果 public class Test01 { public static void main(String[] args) { int i1 = 5; boolean result = (i1++ &gt; 5) &amp;&amp; (++i1 &gt; 4); System.out.println(result); Sy...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
C++知识点 —— 整合(持续更新中)
本文记录自己在自学C++过程中不同于C的一些知识点,适合于有C语言基础的同学阅读。如果纰漏,欢迎回复指正 目录 第一部分 基础知识 一、HelloWorld与命名空间 二、引用和引用参数 2.1引用的定义 2.2 将引用用作函数参数 2.3 将引用用于类对象 2.4 引用和继承 2.5 何时使用引用参数 2.6 引用和指针的区别 三、内联函数 四、默认参数的...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
Python实例大全(基于Python3.7.4)
博客说明: 这是自己写的有关python语言的一篇综合博客。 只作为知识广度和编程技巧学习,不过于追究学习深度,点到即止、会用即可。 主要是基础语句,如三大控制语句(顺序、分支、循环),随机数的生成,数据类型的区分和使用; 也会涉及常用的算法和数据结构,以及面试题相关经验; 主体部分是针对python的数据挖掘和数据分析,主要先攻爬虫方向:正则表达式匹配,常用数据清洗办法,scrapy及其他爬虫框架,数据存储方式及其实现; 最后还会粗略涉及人工智能领域,玩转大数据与云计算、进行相关的预测和分析。
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
机械转行java自学经历,零基础学java,血泪总结的干货
机械转行java自学经历,零基础学java,血泪总结的干货 据说,再恩爱的夫妻,一生中都有100次想离婚的念头和50次想掐死对方的冲动。 求职路上亦是如此,打开这篇文章,相信你也有转行的想法。和身边的朋友聊过,入职后的他们,或多或少对现在的职位都有些不满,都有过转行的冲动。 可他们只是想,而我真的这样做了。 下面就介绍下我转行的血泪史。 我为什么要转行 高中复读了一年,考了个双非院校的机械。当时...
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
【Linux系统编程】Linux信号列表
00. 目录 文章目录00. 目录01. Linux信号编号02. 信号简介03. 特殊信号04. 附录 01. Linux信号编号 在 Linux 下,每个信号的名字都以字符 SIG 开头,每个信号和一个数字编码相对应,在头文件 signum.h 中,这些信号都被定义为正整数。信号名定义路径:/usr/include/i386-linux-gnu/bits/signum.h 要想查看这些信号和...
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
借助AI力量,谷歌解开生命奥秘?
全文共4484字,预计学习时长8分钟 Paweł Czerwiński发布在 Unsplash上的原图 假如疾病不复存在会发生什么?如果我们能像大自然一样迅速获取能量又会发生什么?要是我们能够在极短时间内循环塑料、废油、或其它的一些物质呢?如果人类能够解开生命的奥秘,那么以上这些想象将在未来成为现实。人工智能企业DeepMind的数据科学分析师日前在此领域有了重大发现。以下为具体内容:...
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问