编辑:所以在与Assimp dev进行短暂接触之后,我被指向了导入过程.当我从其他人手中接过代码时,我没想到要看那个部分:
using (var importer = new AssimpContext())
{
scene = importer.ImportFile(file, PostProcessSteps.Triangulate | PostProcessSteps.FlipUVs | PostProcessSteps.JoinIdenticalVertices);
}
Run Code Online (Sandbox Code Playgroud)
FlipUV完全按照它所说的做法,它在y轴上翻转,因此原点现在位于左上角.所以现在我能够获得具有适当UV但仍然是镜像网格的模型.使用比例x = -1设置父对象会将其翻转回正常并使其看起来很好,但我想这并不意味着.所以我一直在寻找.
看图,有两种起重机型号.左边的那个在运行时通过序列化和重建加载,而右边的那个是原始的,只是拖动到场景.序列化发生在Assimp库中.
地板碰巧首先被创建,似乎得到了正确的紫外线地图.而其他项目出错了uv map.虽然我正在打印紫外线地图的值,但它们似乎与原始地图相匹配.
这是序列化的方法,这是来自Assimp的Mesh类,而不是Unity Mesh类,应用程序序列化是在UWP中构建的Windows应用程序:
private static void SerializeMeshes(BinaryWriter writer, IEnumerable<Mesh> meshes)
{
foreach (Mesh mesh in meshes)
{
ICollection<int> triangles = MeshLoadTriangles(mesh);
MeshSerializeHeader(writer, mesh.Name, mesh.VertexCount, triangles.Count, mesh.MaterialIndex);
MeshSerializeVertices(writer, mesh.Vertices);
MeshSerializeUVCoordinate(writer, mesh.TextureCoordinateChannels);
MeshSerializeTriangleIndices(writer, triangles);
}
}
private static void MeshSerializeUVCoordinate(BinaryWriter writer, List<Vector3D>[] textureCoordinateChannels)
{
// get first channel and serialize to writer. Discard z channel
// This is Vector3D …
Run Code Online (Sandbox Code Playgroud) 我试图仅使用6个音频剪辑重新创建全系列的吉他.
我想有一种设置音频剪辑频率的方法,但audio.frequency只返回基于压缩格式而不是实际音调的音频频率.
我知道我可以阅读GetSpectrumData,但是这个解决方案相当复杂,需要进行一些傅里叶变换分析或类似的东西.
影响音高,很容易改变音调,所以我可以上下,但是有办法弄清楚使用的步骤是什么.
void Update ()
{
CheckAudio(KeyCode.Q, 1.0f);
CheckAudio(KeyCode.W, 1.1f);
CheckAudio(KeyCode.E, 1.2f);
CheckAudio(KeyCode.R, 1.3f);
CheckAudio(KeyCode.T, 1.4f);
}
void CheckAudio(KeyCode key, float pitch)
{
if (Input.GetKeyDown (key))
{
audio.pitch = pitch;
audio.Play ();
}
}
Run Code Online (Sandbox Code Playgroud)
我听说听起来不对劲.
知道初始音调E4 329.63Hz,音高为1是否有任何影响音高的方程式,我会得到下一个键F4 349.23Hz(或足够接近)?
还必须考虑Unity AudioSource将音调限制在-3/3范围内(我认为这超出了需要).
编辑:添加一些个人研究.似乎音高1是初始音符,设置为2给出相同的音高一个八度.
由于半音阶(钢琴上的所有黑白音符)都是12个键,我假设每个步骤使用1/12应该这样做.
听起来很接近,但我觉得它不太对劲.这是新代码:
[SerializeField] private AudioSource audio;
float step = 1f/12f;
KeyCode[]keys = new KeyCode[]{
KeyCode.Q, KeyCode.W,KeyCode.E,KeyCode.R,KeyCode.T,
KeyCode.Y, KeyCode.U, KeyCode.I, KeyCode.O, KeyCode.P,
KeyCode.A, KeyCode.S, KeyCode.D
};
void Update ()
{
float f = 0.0f;
foreach (KeyCode key in …
Run Code Online (Sandbox Code Playgroud) 可能重复:
为什么使用"new DelegateType(Delegate)"?
新的Thread(void Target())和新的Thread(新的ThreadStart(void Target()))有什么区别?
所以我经历了一些委托,并以某种方式获得了整个想法.现在,我看到处都像这样:
public delegate void Deleg();
Deleg deleg = new Deleg(FunctionName);
deleg();
Run Code Online (Sandbox Code Playgroud)
我认为这会创建一个委托对象,其函数指向作为参数传递给构造函数.
现在,我也可以这样做:
public delegate void Deleg();
public Deleg deleg;
deleg = FunctionName;
deleg();
Run Code Online (Sandbox Code Playgroud)
这个似乎只创建一个引用,并传递函数的地址.这工作原理相同,并具有所有委托功能.
但是现在,无论事实上我在第二个例子中还有一行,我实际上是否会因为第一个在教程中更受欢迎而失去或获得一些东西?
从VS到设备的构建工作正常.但是使用Master设置构建然后它就不会这样做.由于商店提交需要master,因此从商店下载会遇到问题.
我一直试图追踪这个问题,基本上输入都没有用.如果我执行点击,我得到:
The thread 0x12a4 has exited with code 0 (0x0).
Run Code Online (Sandbox Code Playgroud)
我认为空间映射也会得到一种奇怪的处理,让我觉得它可能与多线程有关(因为我能想到的唯一关联就是在内部使用多线程).
我认为这只是我们的应用程序之一,但后来被告知第二个应用程序完全不同也有同样的问题.
谁知道该怎么办?我在大约3周前发布了hololens论坛,但还没有人回复.联系微软是一种基本的时间浪费,因为我可能永远不会让任何人拥有这种知识.
任何的想法?
我试图让应用程序基于平台设置一些资产.
第一步是使用基于操作系统的字体,适用于Android的Roboto和适用于iOS的SanFrancisco.
简单地说,Unity无法在运行时导入字体,与其他任何跨平台IDE相比都有一点缺点,但我们不在此判断.另一个解决方案是使用AssetBundle,由于无法解释的原因,我无法完成顶级工作......
最重要的是,没有广泛设想将字体等基本资产存储为字体以外的东西.
所以我的最终解决方案是这个丑陋的脚本:
class FontFamily
{
[Header("Android")]
[SerializeField]
private Font regularAndroid = null;
[SerializeField]
private Font boldAndroid = null;
[SerializeField]
private Font italicAndroid = null;
[Header("iOS")]
[SerializeField]
private Font regularIOS = null;
[SerializeField]
private Font boldIOS = null;
[SerializeField]
private Font italicIOS = null;
public Font Regular
{
get
{
#if UNITY_ANDROID
return this.regularAndroid;
#elif UNITY_IOS
return this.regularIOS;
#endif
}
}
public Font Bold
{
get
{
#if UNITY_ANDROID
return this.boldAndroid;
#elif UNITY_IOS
return this.boldIOS;
#endif
}
} …
Run Code Online (Sandbox Code Playgroud) 希望这不是重复.
在此之前,我知道ArrayList不是最好的选择,但这只是好奇心.
简单地说,我想知道ArrayList的实现.我查看并想通了它使用数组存储.
对于数组,当你有:
int [] arr;
Run Code Online (Sandbox Code Playgroud)
arr指向数组的第一个元素,因为它被输入为整数,编译器知道跳转的位置:
arr[2] => arr value + 2 * typeof(int) = address of arr[2]
Run Code Online (Sandbox Code Playgroud)
现在,由于ArrayList是无类型的,我想知道编译器如何能够找出下一个项目的位置.我猜想有一个开销告诉数据是什么,以便编译器可以执行指针算术.
因此,ArrayList应该比任何其他类型的集合慢,因为它不能只是跳转到数据,因为它需要知道之前的内容.这与LinkedList非常相似.
所以我们尝试用 C# 开发一个数学类,我们做到了。将结果与 System.Math 的原始数学类进行比较表明我们总是迟到一点或很多(特别是触发方法)。
但是当我们使用像 Absolut value 这样不包含大量代码的基本方法时,奇迹就出现了
if(value < 0) return -value;
else return value;
Run Code Online (Sandbox Code Playgroud)
我们仍然远远落后。
我不能让这个 abs 方法更小,我猜使用三元运算符也无济于事。
是因为 System.Math 是用 C 编写的吗?如果我们用母语写它会不会更快,尽管我读过它似乎不会改变太多。最后,一个 dll 能不能比一个类工作得更快,如果是,为什么,如果不是......为什么呢?
已经谢谢了。
嘿,
所以我们有一整群人在同一个项目上工作,并且时不时地有些文件显示为隐藏,你知道像 obj 或 bin 这样的空白文件图标。
看到我的字体和纹理了吗?他们应该是正常的。
因此,我可以在文件夹中看到它们,但不能在解决方案资源管理器中看到它们,而无需点击“显示隐藏文件”。我也可以修改它们,但我希望它们回来。
我一直在尝试查看是否有解决方案,但我得到的只是关于如何显示隐藏文件的博客。
所以我发现这个线程 Visual Studio 2012 和丢失的文件 似乎给出了我的问题的原因。人们在推送到 github 之前没有正确保存。
现在有解决方案吗?(除了正确保存)我可以让所有这些文件成为普通文件吗?
干杯
我在Youtube上使用OpenGl 3和BennyBox的教程.
使用此方法:
static void CheckShaderError(GLuint shader, GLuint flag, bool isProgram, const std::string& errorMessage){
GLint success = 0;
GLchar error [1024] = {0};
if(isProgram){
glGetProgramiv(shader, flag, &success);
}else{
glGetShaderiv(shader, flag, &success);
}
if(success == GL_FALSE){
if(isProgram){
glGetProgramInfoLog(shader, sizeof(error), NULL, error);
}else{
glGetShaderInfoLog(shader,sizeof(error), NULL, error);
}
std::cerr<< errorMessage<< ": " << error<< "'"<<std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我应该能够加载着色器文件(片段和顶点着色器).它适用于基本着色器,但是当我尝试将它们修改为该点时:
#version 120
attribute vec3 position;
attribute vec2 texCoord;
varying vec2 texCoord;
void main(){
gl_Position = vec4(position, 1.0);
texCoord0 = texCoord;
}
Run Code Online (Sandbox Code Playgroud)
我得到:
Error compiling shader!: …
Run Code Online (Sandbox Code Playgroud)