我正在尝试用 Java 和 Groovy 实现一个有点通用的 DSL。这个想法是使用类似的语法data { name 'my name' }并拦截所有方法调用,methodMissing在那里我可以检查方法名称是否等于一个字段并通过运行闭包来设置它。我使用 Java 编写我的数据类,它看起来像这样。
public class TestData {
@Getter @Setter
protected String name;
public void call(Closure closure) {
closure.setResolveStrategy(Closure.DELEGATE_FIRST);
closure.setDelegate(this);
closure.call();
}
public Object methodMissing(String name, Object args) {
// here we extract the closure from arguments, etc
return "methodMissing called with name '" + name + "' and args = " + argsList;
}
}
Run Code Online (Sandbox Code Playgroud)
运行 DSL 脚本的代码是这样的
TestData testData = new TestData();
Binding binding = …Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个简单的光线跟踪应用程序,并且为了使事情保持一致和整洁,我决定使用像OpenGL这样的转换矩阵。我对场景中的每个节点都有一个模型矩阵,除了法线之外,其他所有东西似乎都可以正常工作(光线相交,模型转换)。根据我的阅读,可以glm::inverseTranspose(modelViewMatrix)用来获取法线矩阵,该法线矩阵应保持法线垂直于面部。(所有的计算都是在世界空间中进行的,因此我的viewMatrix是一个恒等式,因此我将法线矩阵计算为glm::inverseTranspose(modelMatrix))。但是,我得到了奇怪的结果:当我在世界空间中计算法线时newNormal = normalMatrix * glm::vec4(normnal, 0.0f),其w坐标中出现了垃圾。我究竟做错了什么?