地图不适用于加载的 Obj

2023-12-07

这是我之前的问题的延续here。我只是尝试向该对象的每一侧应用不同的纹理,但什么也没有出现。没有控制台错误,我相信我正在按正确的顺序应用事物。

这应该很简单,但过去一个小时我一直在努力解决这个问题。下面是一个代码示例:

(function onLoad() {
  var canvasElement;
  var width, height;
  var scene, camera;
  var renderer;
  var controls;

  var pivot;
  var bagMesh;
  var planeMesh;
  
  const objLoader = new THREE.OBJLoader2();
  const fileLoader = new THREE.FileLoader();
  const textureLoader = new THREE.TextureLoader();
 
  init();

  function init() {
    container = document.getElementById('container');
    initScene();
    addGridHelper();
    addCamera();
    addLighting();
    addRenderer();
    addOrbitControls();

    loadPlaneObj();
    
    // Logic
		var update = function() {};

		// Draw scene
		var render = function() {
			renderer.render(scene, camera);
		};

		// Run game logic (update, render, repeat)
		var gameLoop = function() {
			requestAnimationFrame(gameLoop);
			update();
			render();
		};
		gameLoop();
  }

  /**** Basic Scene Setup ****/
  function initScene() {
    scene = new THREE.Scene();
    scene.background = new THREE.Color(0xd3d3d3);
    var axis = new THREE.AxesHelper();
    scene.add(axis);
  }

  function addCamera() {
    camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 1000);
    camera.position.set(3,3,3);
    scene.add(camera);
  }

  function addGridHelper() {
    var planeGeometry = new THREE.PlaneGeometry(2000, 2000);
    planeGeometry.rotateX(-Math.PI / 2);

    var planeMaterial = new THREE.ShadowMaterial({
      opacity: 0.2
    });
    var plane = new THREE.Mesh(planeGeometry, planeMaterial);
    plane.position.y = -200;
    plane.receiveShadow = true;
    scene.add(plane);

    var helper = new THREE.GridHelper(2000, 100);
    helper.material.opacity = 0.25;
    helper.material.transparent = true;
    scene.add(helper);

    var axis = new THREE.AxesHelper();
    scene.add(axis);
  }

  // *********** Lighting settings **********************
  function addLighting() {
    var light = new THREE.HemisphereLight(0xffffff, 0xffffff, 1);
    scene.add(light);
  }

  // ************** Material settings **************
  function setMaterial(materialName) {
    // get the object from the scene
    var bagMesh = scene.getObjectByName('bag');
    var material;

    if (!materialName) {
      materialName = materials.material;
    }

    if (bagMesh) {
      var colour = parseInt(materials.colour);
      switch (materialName) {
        case 'MeshBasicMaterial':
          material = new THREE.MeshBasicMaterial({
            color: colour
          });
          break;
        case 'MeshDepthMaterial':
          material = new THREE.MeshDepthMaterial();
          break;
        case 'MeshLambertMaterial':
          material = new THREE.MeshLambertMaterial({
            color: colour
          });
          break;
        case 'MeshNormalMaterial':
          material = new THREE.MeshNormalMaterial();
          break;
        case 'MeshPhongMaterial':
          material = new THREE.MeshPhongMaterial({
            color: colour
          });
          break;
        case 'MeshPhysicalMaterial':
          material = new THREE.MeshPhysicalMaterial({
            color: colour
          });
          break;
        case 'MeshStandardMaterial':
          material = new THREE.MeshStandardMaterial({
            color: colour
          });
          break;
        case 'MeshToonMaterial':
          material = new THREE.MeshToonMaterial({
            color: colour
          });
          break;
      }
      bagMesh.children.forEach(function(c) {
        c.material = material;
      });
    }
  }

  function setMaterialColour(colour) {
    materials.colour = colour;
    setMaterial(null);
  }
  // ************** End of materials ***************

  function addRenderer() {
    renderer = new THREE.WebGLRenderer({
      antialias: true
    });
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.shadowMap.enabled = true;
    container.appendChild(renderer.domElement);
  }

  function addOrbitControls() {
    var controls = new THREE.OrbitControls(camera, renderer.domElement);
  }

  function addPivot() {
    var cubeGeo = new THREE.BoxBufferGeometry(5, 5, 5);
    var cubeMat = new THREE.MeshBasicMaterial();
    pivot = new THREE.Mesh(cubeGeo, cubeMat);
    bagMesh.position.x -= 15;
    bagMesh.position.z -= 55;

    pivot.add(bagMesh);
    pivot.add(handle);
    scene.add(pivot);
  }
  
  function loadPlaneObj() {
		loadObjWithMtl('PlaneWithMaterial', 
      'https://rawgit.com/Katana24/threejs-experimentation/material-test/models/PlaneWithMaterial.obj', 
      'https://rawgit.com/Katana24/threejs-experimentation/material-test/models/PlaneWithMaterial.mtl')
			.then(function(mesh) {
        loadTexture(
          'https://rawgit.com/Katana24/threejs-experimentation/material-test/img/1.jpg', scene, 0xff0000, THREE.FrontSide, mesh);
			});
	}
  
  function loadObjWithMtl(modelName, modelUrl, mtlUrl) {
		return new Promise(function(resolve, reject) {
			var callbackOnLoad = function ( event ) { resolve(event.detail.loaderRootNode); };
			var onLoadMtl = function ( materials ) {
				objLoader.setModelName( modelName );
				objLoader.setMaterials( materials );
				objLoader.getLogger().setDebug( true );
				objLoader.load( modelUrl, callbackOnLoad, null, null, null, false );
			};
			objLoader.loadMtl(mtlUrl, null, onLoadMtl );
		});
	}

	function loadTexture(imgPath, scene, color, side, mesh) {
		var loadedMesh = mesh;
	  textureLoader.load(imgPath,
			function (texture) {	
        var geometry = new THREE.Geometry().fromBufferGeometry( loadedMesh.children[0].geometry );
				mesh.children[0].material.map = texture;
				mesh.children[0].material.needsUpdate = true;
				scene.add(mesh);
			},
			undefined,
			function ( err ) {
				console.error( 'An error occurred...' );
			}
		);
	}
  
  function addPlaneToSceneSOAnswer(mesh) {
		var frontMaterial = new THREE.MeshBasicMaterial( { color : 0xff0000, side: THREE.FrontSide } );
		var backMaterial 	= new THREE.MeshBasicMaterial( { color : 0x00ff00, side: THREE.BackSide } );
		
		var geometry = new THREE.Geometry().fromBufferGeometry( mesh.children[0].geometry );
		var length = geometry.faces.length;
		geometry.faces.splice(14, 1);

		for (var i = 0; i < geometry.faces.length; i ++ ) {
			var face = geometry.faces[i];
			face.color.setHex(Math.random() * 0xffffff);
		}
		mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial({ vertexColors: THREE.FaceColors, side: THREE.DoubleSide }) );
		mesh.material.side = THREE.FrontSide; 
		
		var mesh2 = new THREE.Mesh( geometry, mesh.material.clone() ); 
		mesh2.material.side = THREE.BackSide; 
		// mesh2.material.vertexColors = THREE.NoColors; 
		mesh2.material.vertexColors = [new THREE.Color(0xff0000), new THREE.Color(0x00ff00), new THREE.Color(0x0000ff)];

		mesh.add( mesh2 );
		scene.add(mesh);
	}
})();
body {
  background: transparent;
  padding: 0;
  margin: 0;
  font-family: sans-serif;
}

#canvas {
  margin: 10px auto;
  width: 800px;
  height: 350px;
  margin-top: -44px;
}
<body>
  <div id="container"></div>
  <script src="https://threejs.org/build/three.js"></script>
  <script src="https://threejs.org/examples/js/libs/dat.gui.min.js"></script>
  <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
  <script src="https://threejs.org/examples/js/loaders/MTLLoader.js"></script>
  <script src="https://rawgit.com/mrdoob/three.js/dev/examples/js/loaders/LoaderSupport.js"></script>
  <script src="https://rawgit.com/mrdoob/three.js/dev/examples/js/loaders/OBJLoader2.js"></script>
</body>

那么我在这里做错了什么简单的事情呢?我认为问题出在这个函数上:

  function loadTexture(imgPath, scene, color, side, mesh) {
    var loadedMesh = mesh;
    textureLoader.load(imgPath,
      function (texture) {  
        var geometry = new THREE.Geometry().fromBufferGeometry( loadedMesh.children[0].geometry );
        mesh.children[0].material.map = texture;
        mesh.children[0].material.needsUpdate = true;
        scene.add(mesh);
      },
      undefined,
      function ( err ) {
        console.error( 'An error occurred...' );
      }
    );
  }

该函数获取网格,然后加载所需的纹理并将其应用到网格中的材质。然后它告诉材料进行更新。这是正确的方法吗?

这个答案here实际上只有在一切设置完毕后才调用渲染,但我希望能够在运行时更改纹理、材质等。

我以为mesh.children[0].material.needsUpdate = true会向着色器程序发出信号以更新...

Thanks


纹理已正确加载,但未正确显示,因为搅拌器对象不提供任何纹理坐标:

# Blender v2.77 (sub 0) OBJ File: 'Plane.blend'
# www.blender.org
mtllib PlaneWithMaterial.mtl
o Plane
v -1.000000 0.000000 1.000000
v 1.000000 0.000000 1.000000
v -1.000000 0.000000 -1.000000
v 1.000000 0.000000 -1.000000
vn 0.0000 1.0000 0.0000
usemtl Material
s off
f 1//1 2//1 4//1 3//1

请改用以下对象:

# Blender v2.77 (sub 0) OBJ File: 'Plane.blend'
# www.blender.org
mtllib PlaneWithMaterial.mtl
o Plane

v -1.000000 0.000000 1.000000
v 1.000000 0.000000 1.000000
v -1.000000 0.000000 -1.000000
v 1.000000 0.000000 -1.000000

vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 1.000000 1.000000

vn 0.0000 1.0000 0.0000

usemtl Material
s off
f 1/1/1 2/2/1 4/4/1 3/3/1

看代码片段:

(function onLoad() {
  var canvasElement;
  var width, height;
  var scene, camera;
  var renderer;
  var controls;

  var pivot;
  var bagMesh;
  var planeMesh;
  
  const objLoader = new THREE.OBJLoader2();
  const fileLoader = new THREE.FileLoader();
  const textureLoader = new THREE.TextureLoader();
  textureLoader.setCrossOrigin("");
 
  init();

  function init() {
    container = document.getElementById('container');
    initScene();
    addGridHelper();
    addCamera();
    addLighting();
    addRenderer();
    addOrbitControls();

    loadPlaneObj();
    
    // Logic
		var update = function() {};

		// Draw scene
		var render = function() {
			renderer.render(scene, camera);
		};
    
    function resize() {
      var aspect = window.innerWidth / window.innerHeight;
      renderer.setSize(window.innerWidth, window.innerHeight);
      camera.aspect = aspect;
      camera.updateProjectionMatrix();
    }
    window.onresize = resize;

		// Run game logic (update, render, repeat)
		var gameLoop = function() {
			requestAnimationFrame(gameLoop);
			update();
			render();
		};
		gameLoop();
  }

  /**** Basic Scene Setup ****/
  function initScene() {
    scene = new THREE.Scene();
    scene.background = new THREE.Color(0xd3d3d3);
    var axis = new THREE.AxesHelper();
    scene.add(axis);
  }

  function addCamera() {
    camera = new THREE.PerspectiveCamera(70, window.innerWidth / window.innerHeight, 1, 1000);
    camera.position.set(1,1,1);
    scene.add(camera);
  }

  function addGridHelper() {
    var planeGeometry = new THREE.PlaneGeometry(2000, 2000);
    planeGeometry.rotateX(-Math.PI / 2);

    var planeMaterial = new THREE.ShadowMaterial({
      opacity: 0.2
    });
    var plane = new THREE.Mesh(planeGeometry, planeMaterial);
    plane.position.y = -200;
    plane.receiveShadow = true;
    scene.add(plane);

    var helper = new THREE.GridHelper(2000, 100);
    helper.material.opacity = 0.25;
    helper.material.transparent = true;
    scene.add(helper);

    var axis = new THREE.AxesHelper();
    scene.add(axis);
  }

  // *********** Lighting settings **********************
  function addLighting() {
    var light = new THREE.HemisphereLight(0xffffff, 0xffffff, 1);
    scene.add(light);
  }

  // ************** Material settings **************
  function setMaterial(materialName) {
    // get the object from the scene
    var bagMesh = scene.getObjectByName('bag');
    var material;

    if (!materialName) {
      materialName = materials.material;
    }

    if (bagMesh) {
      var colour = parseInt(materials.colour);
      switch (materialName) {
        case 'MeshBasicMaterial':
          material = new THREE.MeshBasicMaterial({
            color: colour
          });
          break;
        case 'MeshDepthMaterial':
          material = new THREE.MeshDepthMaterial();
          break;
        case 'MeshLambertMaterial':
          material = new THREE.MeshLambertMaterial({
            color: colour
          });
          break;
        case 'MeshNormalMaterial':
          material = new THREE.MeshNormalMaterial();
          break;
        case 'MeshPhongMaterial':
          material = new THREE.MeshPhongMaterial({
            color: colour
          });
          break;
        case 'MeshPhysicalMaterial':
          material = new THREE.MeshPhysicalMaterial({
            color: colour
          });
          break;
        case 'MeshStandardMaterial':
          material = new THREE.MeshStandardMaterial({
            color: colour
          });
          break;
        case 'MeshToonMaterial':
          material = new THREE.MeshToonMaterial({
            color: colour
          });
          break;
      }
      bagMesh.children.forEach(function(c) {
        c.material = material;
      });
    }
  }

  function setMaterialColour(colour) {
    materials.colour = colour;
    setMaterial(null);
  }
  // ************** End of materials ***************

  function addRenderer() {
    renderer = new THREE.WebGLRenderer({
      antialias: true
    });
    renderer.setPixelRatio(window.devicePixelRatio);
    renderer.setSize(window.innerWidth, window.innerHeight);
    renderer.shadowMap.enabled = true;
    container.appendChild(renderer.domElement);
  }

  function addOrbitControls() {
    var controls = new THREE.OrbitControls(camera, renderer.domElement);
  }

  function addPivot() {
    var cubeGeo = new THREE.BoxBufferGeometry(5, 5, 5);
    var cubeMat = new THREE.MeshBasicMaterial();
    pivot = new THREE.Mesh(cubeGeo, cubeMat);
    bagMesh.position.x -= 15;
    bagMesh.position.z -= 55;

    pivot.add(bagMesh);
    pivot.add(handle);
    scene.add(pivot);
  }
  
  function loadPlaneObj() {
    makeTextFile = function (text) {
      var data = new Blob([text], {type: 'text/plain'});
      var textFile = window.URL.createObjectURL(data);
      return textFile;   
    }
    var textbox_obj = document.getElementById('plane_obj');
    var obj_url = makeTextFile(textbox_obj.value);
    var textbox_mtl = document.getElementById('plane_mtl');
    var mtl_url = makeTextFile(textbox_mtl.value);

    loadObjWithMtl('plane1', 
      obj_url, mtl_url)
			.then(function(mesh) {
        loadTexture(
         'https://rawgit.com/Katana24/threejs-experimentation/material-test/img/1.jpg',
         scene, 0xff0000, THREE.FrontSide, mesh);
			});
	}
  
  function loadObjWithMtl(modelName, modelUrl, mtlUrl) {
		return new Promise(function(resolve, reject) {
			var callbackOnLoad = function ( event ) { resolve(event.detail.loaderRootNode); };
			var onLoadMtl = function ( materials ) {
				objLoader.setModelName( modelName );
				objLoader.setMaterials( materials );
				objLoader.getLogger().setDebug( true );
				objLoader.load( modelUrl, callbackOnLoad, null, null, null, false );
			};
			objLoader.loadMtl(mtlUrl, null, onLoadMtl );
		});
	}

	function loadTexture(imgPath, scene, color, side, mesh) {
		var loadedMesh = mesh;
	  textureLoader.load(imgPath,
			function (texture) {	
        var geometry = new THREE.Geometry().fromBufferGeometry( loadedMesh.children[0].geometry );
				mesh.children[0].material.map = texture;
				mesh.children[0].material.needsUpdate = true;
				scene.add(mesh);
			},
			undefined,
			function ( err ) {
				console.error( 'An error occurred...' );
			}
		);
	}
  
  function addPlaneToSceneSOAnswer(mesh) {
		var frontMaterial = new THREE.MeshBasicMaterial( { color : 0xff0000, side: THREE.FrontSide } );
		var backMaterial 	= new THREE.MeshBasicMaterial( { color : 0x00ff00, side: THREE.BackSide } );
		
		var geometry = new THREE.Geometry().fromBufferGeometry( mesh.children[0].geometry );
		var length = geometry.faces.length;
		geometry.faces.splice(14, 1);

		for (var i = 0; i < geometry.faces.length; i ++ ) {
			var face = geometry.faces[i];
			face.color.setHex(Math.random() * 0xffffff);
		}
		mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial({ vertexColors: THREE.FaceColors, side: THREE.DoubleSide }) );
		mesh.material.side = THREE.FrontSide; 
		
		var mesh2 = new THREE.Mesh( geometry, mesh.material.clone() ); 
		mesh2.material.side = THREE.BackSide; 
		// mesh2.material.vertexColors = THREE.NoColors; 
		mesh2.material.vertexColors = [new THREE.Color(0xff0000), new THREE.Color(0x00ff00), new THREE.Color(0x0000ff)];

		mesh.add( mesh2 );
		scene.add(mesh);
	}
})();
body {
  background: transparent;
  padding: 0;
  margin: 0;
  font-family: sans-serif;
}

#canvas {
  margin: 10px auto;
  width: 800px;
  height: 350px;
  margin-top: -44px;
}
<body>
  <div id="container"></div>
  <script src="https://threejs.org/build/three.js"></script>
  <script src="https://threejs.org/examples/js/libs/dat.gui.min.js"></script>
  <script src="https://threejs.org/examples/js/controls/OrbitControls.js"></script>
  <script src="https://threejs.org/examples/js/loaders/MTLLoader.js"></script>
  <script src="https://rawgit.com/mrdoob/three.js/dev/examples/js/loaders/LoaderSupport.js"></script>
  <script src="https://rawgit.com/mrdoob/three.js/dev/examples/js/loaders/OBJLoader2.js"></script>

  <textarea id="plane_obj" style="display:none;">
    # Blender v2.77 (sub 0) OBJ File: 'Plane.blend'
    # www.blender.org
    mtllib Plane.mtl
    o Plane
    
    v -1.000000 0.000000 1.000000
    v 1.000000 0.000000 1.000000
    v -1.000000 0.000000 -1.000000
    v 1.000000 0.000000 -1.000000
    
    vt 0.000000 0.000000
    vt 1.000000 0.000000
    vt 0.000000 1.000000
    vt 1.000000 1.000000
    
    vn 0.0000 1.0000 0.0000
    
    usemtl None
    s off
    f 1/1/1 2/2/1 4/4/1 3/3/1
  </textarea>

  <textarea id="plane_mtl" style="display:none;">
    # Blender MTL File: 'Plane.blend'
    # Material Count: 1
    
    newmtl None
    Ns 0
    Ka 0.000000 0.000000 0.000000
    Kd 0.8 0.8 0.8
    Ks 0.8 0.8 0.8
    d 1
    illum 2
  </textarea>

</body>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

地图不适用于加载的 Obj 的相关文章

随机推荐

  • 如何给 iframe 100% 高度[重复]

    这个问题在这里已经有答案了 我想 但它仍然没有调整它的大小 当我尝试以像素为单位的高度时 它起作用了 编辑 100 似乎可以在 IE 上运行 但不能在 Firefox 上运行 你可以用 CSS 来做到这一点 请注意 默认情况下 这会将其放置
  • Android中如何知道定位模式是WIFI还是2G/3G基站?

    我们知道Android中有两种定位模式 GPS和网络 如果我们使用网络 那么Android可以使用WIFI或2G 3G基站进行定位 如果没有GPS 我们可以简单地使用LocationManager NETWORK PROVIDER来获取位置
  • 信号量和条件的区别(ReentrantLock)

    有谁知道这些方法之间的区别acquire and release java util concurrent Semaphore and await and signal new ReentrantLock newCondition 您能为每
  • Python 列表推导式 - 转置

    我刚刚开始通过阅读列表理解矩阵转置教程在这里 我理解这个例子 但我试图找出一种转置矩阵的方法 而不需要对范围进行硬编码 matrix 1 2 3 4 5 6 7 8 9 10 11 12 lcomp row i for row in mat
  • 通过导航 doPostBack 使用 R 抓取网站

    我想定期从下面的站点提取表格 单击构建块名称 BLOK 16 A BLOK 16 B BLOK 16 C 时 价目表会发生变化 URL不改变 页面通过触发改变 javascript doPostBack ctl00 ContentPlace
  • Spark SQL saveAsTable 返回空结果

    我使用以下代码在 Spark SQL 中创建 插入数据到 Hive 表中 val sc SparkSession builder appName App master local 2 config spark sql warehouse d
  • quote_ident() 不会向列名“first”添加引号

    我需要获得正确用双引号引起来的列名 quote ident 好像没有做到吧 select 1 first fails select quote ident first produces first not first 我可以使用什么命令来成
  • 按字符串的组成部分对字符串列表进行排序

    一个长列表包含一些要排序的元素 实际上每个元素有4个内容 名称 进 出 区域和日期 时间 以 连接 可以更改 我想将列表重新组织为排序顺序 a list Chris Check in Zoom A 11 13 2013 05 20 Chri
  • 禁用热链接或直接下载我的视频,并且仅在视频从我的网站页面显示时流式传输

    我想禁用盗链FLV and MP4托管在我的服务器上的视频 除非视频是从其 URL 所在的页面显示的以 开始 http www mywebsite com index php main page videos page 我必须添加到 hta
  • 强制洗牌 NSMutableArray

    我有一个名为 putNumberUsed 的 NSMutableArray 它包含以下对象 blah1 blah2 blah3 blah4 我想随机洗牌这些对象 例如 如果我选择 putNumberUsed objectAtIndex 0
  • 音频播放无法开始

    NSError err Initialize audio player audioPlayer AVAudioPlayer alloc initWithContentsOfURL url error err audioPlayer dele
  • 在Go中,删除指针映射的条目会导致内存泄漏吗?

    第一次来到这里 首先NOTE in 切片技巧表明在剪切或删除指针切片中的元素时存在潜在的内存泄漏问题 地图也是如此吗 例如 https play golang org p 67cN0JggWY 在从地图中删除之前我们应该清零该条目吗 就像这
  • android.app.Application 无法转换为 android.app.Activity

    我正在尝试改变一个LinearLayout来自另一个类 但是当我运行此代码时 public class IRC extends PircBot ArrayList
  • 如何响应演员调用的结果?

    我们正在考虑使用 Akka HTTP Java API 使用路由 DSL 不清楚如何使用路由功能来响应 HttpRequest 使用无类型 Akka Actor 例如 在匹配 Route 路径后 我们如何将请求传递给 处理程序 ActorR
  • 实体框架-使其只读? [复制]

    这个问题在这里已经有答案了 可能的重复 如何使实体框架数据上下文只读 是否有配置设置或简单的方法使实体 只读 我有一个数据访问层 该层与作为 CRM 解决方案后端的数据库相对应 我们不想 无意或故意 写入 CRM UI 之外的数据库 但我们
  • 如何将 int[] 类型转换为 int?[]

    我正在使用 linq 查询来输出 int 数组 但我需要将其传递给仅接受 int 的方法 因此 在搜索了将 int 转换为 int 的方法之后 我发现了一些似乎可行的方法here 以下代码是一个简化的示例 显示了哪些内容有效 哪些无效 us
  • 如何以编程方式在 Windows 8 开始屏幕上放置磁贴?

    我正在构建一个 Windows 商店应用程序 我希望该应用程序的磁贴位于我的开始屏幕的特定位置 是否有任何 API 可以对我的图块在开始屏幕上的位置进行编码 提前致谢 不 您无法控制图块的移动位置 这由用户决定 Windows 8 环境设计
  • 如何将heroku 上回形针的上传目录更改为/tmp?

    我需要上传文件 然后使用回形针解析它们 目前它上传到 system文件夹中 这在heroku中是不允许的 我不需要持久上传 我解析它然后存储它们 所以我希望能够保存到 tmp 中然后解析 然后让它稍后被吹走 关于如何做到这一点的想法 如果我
  • 如何在R中两个单词之间的文本上进行gsub?

    EDIT 我想放置一个 n在我的文本中特定的未知单词之前 我知道这个未知词第一次出现在我的文本中将会在 树 和 湖 之间 前任 文本 text 1 TreeRULakeSunWater 2 A B C D EDIT 树 和 湖 永远不会改变
  • 地图不适用于加载的 Obj

    这是我之前的问题的延续here 我只是尝试向该对象的每一侧应用不同的纹理 但什么也没有出现 没有控制台错误 我相信我正在按正确的顺序应用事物 这应该很简单 但过去一个小时我一直在努力解决这个问题 下面是一个代码示例 function onL