如何使用THREE.OBJLoader方法渲染OBJ文件,我有一个示例OBJ格式,但它不会渲染任何东西,也不会在chrome开发工具中看到错误
在填充整个场景的three.js场景中显示网格.在这种情况下,场景是整个窗口.
此网格表示3D表面,可以使用鼠标移动使用THREE.TrackballControls此网格面向相机,因此最初它看起来像一个平面(2D)表面,直到使用鼠标拉动轨迹球.
网格线的宽度应等于渲染器的宽度.
我已经为我到目前为止所做的工作设置了一个有效的jsFiddle.
首先,我找到场景的边界(所有这些都在jsFiddle中),
App = function(sceneContainerName) {
this.sceneContainerName = sceneContainerName;
this.SCREEN_WIDTH = window.innerWidth;
this.SCREEN_HEIGHT = window.innerHeight;
this.MAX_X = this.SCREEN_WIDTH / 2;
this.MIN_X = 0 - (this.SCREEN_WIDTH / 2);
this.MAX_Y = this.SCREEN_HEIGHT / 2;
this.MIN_Y = 0 - (this.SCREEN_HEIGHT / 2);
this.NUM_HORIZONTAL_LINES = 50;
this.init();
Run Code Online (Sandbox Code Playgroud)
};
设置three.js
init: function() {
// init scene
this.scene = new THREE.Scene();
// init camera
// View Angle, Aspect, Near, Far
this.camera = new THREE.PerspectiveCamera(45, this.SCREEN_WIDTH / this.SCREEN_HEIGHT, …Run Code Online (Sandbox Code Playgroud) 我真的很难理解d3 area和stack布局的东西.我尝试制作我认为最小的例子,但没有出现,事实上它在控制台中打印错误.我得不到什么?这是代码.
var svg = d3.select("body").append("svg")
.attr("width", 400)
.attr("height", 300)
var testData = [
[ 0, 10],
[10, 20],
[20, 30],
[30, 20],
];
svg.selectAll("path.area")
.data(testData)
.enter().append("path")
.style("fill", "#ff0000")
.attr("d", d3.svg.area());
Run Code Online (Sandbox Code Playgroud) 我最近开始玩three.js.注意到即使有几千个简单的立方体,性能也开始下降.
所以这带来了我的主要问题:有没有办法使用three.js?我很确定这种性能下降与drawcalls有关,因此如果以某种方式使用three.js进行实例化,它可以帮助支持性能.
我知道缓冲区但是在这一点上我不可能创建一个几何缓冲区,它可以让我在运行时修改单个对象.如果有一个库来处理所有这些,这也算作一个解决方案.
不久,我正在寻找一个相当于three.js中的对象实例.任何建议表示赞赏.
我想要完成的事情.我想分享一个画布(因为我正在做的事情非常沉重),所以我想我会做一个有限的资源管理器.您可以通过承诺询问资源,在本例中为a Canvas2DRenderingContext.它会将上下文包装在可撤销的代理中.完成后,您需要调用release,它将canvas返回给有限的资源管理器,以便它可以将其提供给其他人并且它会撤消代理,这样用户就不会再意外地使用该资源.
除非我代理Canvas2DRenderingContext它失败.
const ctx = document.createElement('canvas').getContext('2d');
const proxy = new Proxy(ctx, {});
// try to change the width of the canvas via the proxy
test(() => { proxy.canvas.width = 100; }); // ERROR
// try to translate the origin of via the proxy
test(() => { proxy.translate(1, 2); }); // ERROR
function test(fn) {
try {
fn();
} catch (e) {
console.log("FAILED:", e, fn);
}
}Run Code Online (Sandbox Code Playgroud)
上面的代码Uncaught TypeError: Illegal invocation在Chrome和TypeError: 'get canvas' called …
我正在使用java来运行用Rhino编写的命令行实用程序,但如果有错误,我需要将该错误返回给shell,以便处理停止.如何将错误代码从Rhino传回shell?
我想要求用户在访问我的GAE(Google App Engine)应用程序的某些部分时使用登录名/密码.我想限制对预定义用户集的访问,例如在页面上,可以将新数据上载到数据存储区.
我发现有在GAE 3种方式如何可以解决的,但它看起来像只有最后一个(最复杂),可能是我的问题的解决方案:
使用部署描述符(<security-constraint>在web.xml中).这并不好,因为这些用户可以访问,即使是GAE应用程序管理页面的查看者,他们也可以看到帐单历史记录,浏览数据存储区,日志等等,这是我必须避免的.
使用联合登录(Open ID)(https://developers.google.com/appengine/articles/openid)并允许用户使用他们的Google,Yahoo!或其他登录身份.它不是一个解决方案,因为我想限制对一小组用户的访问(最多5个)并且不允许每个人使用该应用程序.
另一个选项是创建只能通过HTTPS访问的简单自定义登录页面,并让用户在POST请求中发送用户名和密码(它可以很简单,因为我们有安全的https连接)到servlet,在servlet上生成一些会话标识符具有指定的有效性并使其成为每个后续请求的一部分.如果会话标识符存在且同时未手动过期,则还需要在用户每次发送GET或POST请求时进行检查.
关于如何维护管理员帐户的任何其他/更好的建议?可以HttpSession帮助最后一个变种?
亲切的问候,STeN
authentication google-app-engine servlets httpsession google-openid
如何在不影响当前分支的情况下获取远程分支并更新该分支的git的本地引用?例如,如果我这样做
$ git pull origin master
Run Code Online (Sandbox Code Playgroud)
origin/master合并到我当前的分支中.这也行不通
$ git fetch origin master
Run Code Online (Sandbox Code Playgroud)
那时我检查一下
$ git branch -r -v
origin/HEAD -> origin/master
origin/master 7cf6ec5 test 02
Run Code Online (Sandbox Code Playgroud)
origin/master ref"7cf6ec5 test 02"落后了.真正的起源/主人是"XXXXXX测试03". git fetch只将更改拉入FETCH_HEAD,它没有上传本地origin/master ref.更新该ref的步骤是什么?
注意:
$ git fetch origin
Run Code Online (Sandbox Code Playgroud)
将获得所有远程引用并更新它们但不幸的是(a)很多混乱.(我不希望别人的30-50个随机分支知道有人不想要我的)和(b)因为分支在原点上删除了那些引用在下次我没有被本地删除git fetch origin这意味着路径结束愚蠢的.
问题是,如何只获取一个分支并在本地更新其ref?
假设我有一个这样的程序
// print-addresses.cpp
#include <stdio.h>
void foo() { }
void bar() { }
void moo() { }
int main(int argc, const char** argv) {
printf("%p\n", foo);
printf("%p\n", bar);
printf("%p\n", moo);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它会打印一些数字
013510F0
013510A0
01351109
Run Code Online (Sandbox Code Playgroud)
如何将这些数字转换回正确的符号?实际上,我希望能够做到这一点
print-addresses > address.txt
addresses-to-symbols < address.txt
Run Code Online (Sandbox Code Playgroud)
并打印出来
foo
bar
moo
Run Code Online (Sandbox Code Playgroud)
我知道这与调试接口访问SDK有关,但我并不完全清楚如何从地址转到符号.
我有一个模型的".obj"和".mtl"文件,我正在加载它OBJMTLLoader.".mtl"指定要应用于模型的纹理,并且three.js加载模型并使用应用的纹理渲染它就好了.
但这就是事情.
一旦加载了一个对象,我想在其上应用另一个纹理.这是因为第一纹理表示对象的表面材质.第二个纹理是一个绘图,我想定位在模型上的特定位置.
我的问题是:如何将第二个纹理应用到已加载(和纹理化)的对象上?
我看到three.js创建了一个实例THREE.Object3D,并且该实例具有带有一个实例的"children"数组THREE.Mesh.
当我尝试将纹理应用于该网格(mesh.material.map = texture)时,我失去了初始纹理.
我查看了关于应用多个纹理和JSONLoader但没有找到答案的问题.
我也尝试过使用new THREE.MeshFaceMaterial( materials )(如本答案所示),但没有成功.
更新:
我试过@WestLangley建议使用多材质对象,但仍然无法在另一个上面渲染一个材质.
我做了这个简单的演示,改编自three.js OBJLoader - http://dl.dropboxusercontent.com/u/822184/webgl_multiple_texture/index.html
我THREE.SceneUtils.createMultiMaterialObject按照建议使用它,传递克隆从.obj加载的主网格的几何体.我也给它2个纹理 - 一个用于整个表面,另一个用于模型的前表面.
但这不起作用.我添加了2个复选框,用于切换相应材料的"可见"属性.你可以看到材料存在,但我看不到第二个下面的第一个.
加载/渲染的关键如下:
var texture = THREE.ImageUtils.loadTexture('fabric.jpg');
var texture2 = THREE.ImageUtils.loadTexture('table.jpg');
texture2.offset.set(-0.65, -2.5);
texture2.repeat.set(4, 4);
var loader = new THREE.OBJLoader();
loader.addEventListener( 'load', function ( event ) {
var mainMesh = event.content.children[0].children[0];
multiMaterialObject = THREE.SceneUtils.createMultiMaterialObject(
mainMesh.geometry.clone(), [
new THREE.MeshLambertMaterial({ map: texture2 …Run Code Online (Sandbox Code Playgroud)