- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用线渲染器创建一个“绘图”应用程序,现在我正尝试在 LineRenderer 上使用宽度曲线启用笔压。问题是 AnimationCurve 的“时间”值(水平轴)从 0 归一化为 1,所以每次添加位置时我不能只在它的末尾添加一个值。除非有我不知道的功能,否则我能想到的唯一解决方案是找到一种方法,在我画线时将所有数百个以前的值按精确百分比移动,并在添加位置时执行此操作。这似乎过分了。
我在这里不知所措。
这是我用笔绘制时每帧添加点的基本线。
curve.AddKey(1.0f, penPressureValue);
“1.0f”是曲线上的位置(1 是最后一个),所以这只是在每一帧的末尾添加一个点,在我绘制时改变整条线的宽度。
最佳答案
不幸的是,我认为没有一种方法可以在某种程度上不离奇且性能高。
当然你可以计算它(假设 LineRenderer
从位置计数 = 0 开始),例如
public LineRenderer line;
private int positionCount;
private float totalLengthOld;
private void AddPoint(Vector3 position, float width)
{
// increase the position count by one
positionCount++;
// set the count back to the line
line.positionCount = positionCount;
// add our new point
line.SetPosition(positionCount - 1, position);
// now get the current width curve
var curve = line.widthCurve;
// Is this the beginning of the line?
if (positionCount == 1)
{
// First point => simply set the first keyframe
curve.MoveKey(0, new Keyframe(0f, width));
}
else
{
// otherwise get all positions
var positions = new Vector3[positionCount];
line.GetPositions(positions);
// sum up the distances between positions to obtain the length of the line
var totalLengthNew = 0f;
for (var i = 1; i < positionCount; i++)
{
totalLengthNew += Vector3.Distance(positions[i - 1], positions[i]);
}
// calculate the time factor we have to apply to all already existing keyframes
var factor = totalLengthOld / totalLengthNew;
// then store for the next added point
totalLengthOld = totalLengthNew;
// now move all existing keys which are currently based on the totalLengthOld to according positions based on the totalLengthNew
// we can skip the first one as it will stay at 0 always
var keys = curve.keys;
for (var i = 1; i < keys.Length; i++)
{
var key = keys[i];
key.time *= factor;
curve.MoveKey(i, key);
}
// add the new last keyframe
curve.AddKey(1f, width);
}
// finally write the curve back to the line
line.widthCurve = curve;
}
只是一个小演示
public class Example : MonoBehaviour
{
public LineRenderer line;
public Transform pen;
[Range(0.01f, 0.5f)] public float width;
public float drawThreshold = 0.1f;
private int positionCount;
private float totalLengthOld;
private Vector3 lastPenPosition;
private void Awake()
{
line = GetComponent<LineRenderer>();
line.useWorldSpace = true;
line.positionCount = 0;
lastPenPosition = pen.position;
}
private void Update()
{
// just for the demo simply ping-pong the width over time
width = Mathf.Lerp(0.01f, 0.8f, Mathf.PingPong(Time.time, 1f));
var currentPenPosition = pen.position;
if (Vector3.Distance(lastPenPosition, currentPenPosition) >= drawThreshold)
{
lastPenPosition = currentPenPosition;
AddPoint(currentPenPosition, width);
}
}
private void AddPoint(Vector3 position, float width)
{
positionCount++;
line.positionCount = positionCount;
line.SetPosition(positionCount - 1, position);
var curve = line.widthCurve;
if (positionCount == 1)
{
curve.MoveKey(0, new Keyframe(0f, width));
}
else
{
var positions = new Vector3[positionCount];
line.GetPositions(positions);
var totalLengthNew = 0f;
for (var i = 1; i < positionCount; i++)
{
totalLengthNew += Vector3.Distance(positions[i - 1], positions[i]);
}
var factor = totalLengthOld / totalLengthNew;
totalLengthOld = totalLengthNew;
var keys = curve.keys;
for (var i = 1; i < keys.Length; i++)
{
var key = keys[i];
key.time *= factor;
curve.MoveKey(i, key);
}
curve.AddKey(1f, width);
}
line.widthCurve = curve;
}
}
当然,这会在一定数量的分数后达到性能极限。但我认为目前您可以使用 LineRenderer
到此为止。否则,LineRenderer
可能不是正确的绘图工具。
您当然可以使用技巧,在一定数量的点后使用 LineRenderer.BakeMesh
将现有线烘焙到单独的固定网格中并以最后一点作为起点开始一条新的新线。
在这种情况下,只有线的未烘焙部分实际上会受到宽度曲线键移动的影响。
有点像例如
public int meshBakeThreshold = 50;
private void AddPoint(Vector3 position, float width)
{
......
if (positionCount >= meshBakeThreshold)
{
CreateSnapShotAndStartOver(position, width);
}
}
private void CreateSnapShotAndStartOver(Vector3 position, float width)
{
// create a new GameObject that will receive the line snapsho mesh
var snapshotObject = new GameObject("LineSnapshot", typeof(MeshRenderer), typeof(MeshFilter));
// set the material
var renderer = snapshotObject.GetComponent<Renderer>();
renderer.material = line.material;
// bake and set the mesh
var meshFilter = snapshotObject.GetComponent<MeshFilter>();
var mesh = new Mesh();
line.BakeMesh(mesh, Camera.main, true);
meshFilter.mesh = mesh;
// start with a new line at the same current position
positionCount = 0;
AddPoint(position, width);
}
您需要稍微调整一下阈值,50
可能有点低,只是用于演示。您希望在迭代所有关键帧和烘焙网格的性能成本之间找到平衡;)
关于c# - 当我是 "drawing"线时,如何将点平均分配到 LineRenderer 的宽度曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69982636/
我有一个应用程序,它会抛出 GKSession 并在各种条件下(连接超时、 session 失败等)创建一个新的 GKSession。不过,我遇到了内存泄漏问题,并且有时会在重新连接几次循环后崩溃。
比如我在宿主代码中有一个浮点指针 float *p 是否可以确定他指向的内存类型(设备/主机)? 最佳答案 在 UVA system 中, 运行时 API 函数 cudaPointerGetAttri
我已将项目转换为 .Net 4.0 并且以下代码不起作用: typeof(RuntimeTypeHandle).GetMethod("Allocate", BindingFlags.Instance
当我声明 char ch = 'ab' 时,ch 只包含 'b',为什么它不存储 'a'? #include int main() { char ch = 'ab'; printf("%c"
我对 Disk Sector 和 Block 有疑问。扇区是一个单位,通常为 512 字节或 1k、2k、4k 等取决于硬件。文件系统 block 大小是一组扇区大小。 假设我正在存储一个 5KB 的
假设我有 8 个人和5000 个苹果。 我想将所有苹果分发给所有 8 个人,这样我就没有苹果了。 但每个人都应该得到不同数量 将它们全部分发出去的最佳方式是什么? 我是这样开始的: let peopl
我正在构建的网站顶部有一个搜索栏。与 Trello 或 Gmail 类似,我希望当用户按下“/”键时,他们的焦点就会转到该搜索框。 我的 JavaScript 看起来像这样: document.onk
我有一小段代码: if (PZ_APP.dom.isAnyDomElement($textInputs)){ $textInputs.on("focus", function(){
我观察到以下行为。 接受了两个属性变量。 @property (nonatomic, retain) NSString *stringOne; @property (nonatomic, assign
我正在解决这样的问题 - 实现一个计算由以下内容组成的表达式的函数以下操作数:“(”、“)”、“+”、“-”、“*”、“/”。中的每个数字表达式可能很大(与由字符串表示的一样大)1000 位)。 “/
我有一组主机和一组任务。 每个主机都有 cpu、mem 和任务容量,每个任务都有 cpu、mem 要求。 每个主机都属于一个延迟类别,并且可以与具有特定延迟值的其他主机通信。 每个任务可能需要以等于或
该程序的作用:从文件中读取一个包含 nrRows 行和 nrColomns 列的矩阵(二维数组)。矩阵的所有元素都是 [0,100) 之间的整数。程序必须重新排列矩阵内的所有元素,使每个元素等于其所在
世界!我有个问题。今天我尝试创建一个代码,它可以找到加泰罗尼亚语号码。但是在我的程序中可以是长数字。我找到了分子和分母。但我不能分割长数字!此外,只有标准库必须在此程序中使用。请帮帮我。这是我的代码
我确定我遗漏了一些明显的东西,但我想在 Objective C 中创建一个 NSInteger 指针的实例。 -(NSInteger*) getIntegerPointer{ NSInteger
这个问题在这里已经有了答案: Difference between self.ivar and ivar? (4 个答案) 关闭 9 年前。
我如何将 v[i] 分配给一系列整数(v 的类型是 vector )而无需最初填充 最佳答案 你的意思是将 std::vector 初始化为一系列整数? int i[] = {1, 2, 3, 4,
我想寻求分配方面的帮助....我把这个作业带到了学校......我必须编写程序来加载一个 G 矩阵和第二个 G 矩阵,并搜索第二个 G 矩阵以获取存在数第一个 G 矩阵的......但是,当我尝试运行
我必须管理资源。它基本上是一个唯一的编号,用于标识交换机中的第 2 层连接。可以有 16k 个这样的连接,因此每次用户希望配置连接时,他/她都需要分配一个唯一索引。同样,当用户希望删除连接时,资源(号
是否有任何通用的命名约定来区分已分配和未分配的字符串?我正在寻找的是希望类似于 us/s 来自 Making Wrong Code Look Wrong ,但我宁愿使用常见的东西也不愿自己动手。 最佳
我需要读取一个 .txt 文件并将文件中的每个单词分配到一个结构中,该结构从结构 vector 指向。我将在下面更好地解释。 感谢您的帮助。 我的程序只分配文件的第一个字... 我知道问题出在函数 i
我是一名优秀的程序员,十分优秀!